Sie sind auf Seite 1von 35

SQL : interrogation de BD

Requtes d'interrogation simples


Requtes complexes
SQL et le calcul relationnel
Agrgats et groupement
Couplage SQL et langage de programmation

5-1

Requtes d'interrogation SQL


Structure de base dune requte SQL simples :
SELECT
FROM
WHERE

vari.Aik,
Ri1 var1, Ri2 var2

attributs
variables n-uplet
prdicat/condition

o:

La variable n-uplet vari appartient la table Rij : Ri1(var1)


Les variables dans la projection (clause SELECT) et dans la condition
(clause WHERE) doivent tre lies dans la clause FROM.

Simplifications :
Si varj nest pas spcifie, alors la variable sappelle par dfaut Rij.
Si une seule variable n-uplet possde lattribut A, on peut crire plus
simplement A (non-ambigut).
Cours Bases de donnes (Licence)

5-2

Prdicats
Prdicats simples :

Expression1 Expression2

o Expression1 peut tre un attribut ou une expression


arithmtique impliquant des attributs, = {<, >, =, <=, >=, <>} et
Expression2 une expression ou une valeur de domaine

Exemples :
R.Name = J. Doe
(S.Age + 30) >= 65
R.A = S.B

Prdicats composs :

prdicats simples combins avec les connecteurs logiques


AND, OR, NOT

Cours Bases de donnes (Licence)

5-3

Requtes simples (projection)


Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)

Noms de tous les employs ?


SELECT Ename
FROM
Emp

Noms des projets avec leurs budgets ?


SELECT Pname, Budget
FROM
Project

Villes o un projet existe ?


SELECT DISTINCT City
FROM
Project
* Par dfaut, SQL garde les doublons.
Cours Bases de donnes (Licence)

5-4

Requtes avec prdicats


(projection/slection)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)

Professions qui gagnent plus de 50,000 (slection/projection) ?


SELECT x.Title
FROM
Pay x
WHERE x.Salary > 50000

Numros des managers d'un projet qui dure plus de 17 mois?


SELECT Eno
FROM
Works
WHERE Dur > 17 AND Resp=Manager

Cours Bases de donnes (Licence)

5-5

Requtes avec plusieurs relations


(jointures)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)

Noms et titres des employs qui travaillent dans un


projet pendant plus de 17 mois?
SELECT
FROM
WHERE
AND

Ename, Title
Emp, Works
Dur > 17
Emp.Eno = Works.Eno

Noms et titres des employs qui travaillent dans un


projet Paris (2 jointures) ?
SELECT
FROM
WHERE
AND
AND

Ename, Title
Emp E,Works W,Project P
P.City = Paris
E.Eno = W.Eno
W.Pno = P.Pno

Cours Bases de donnes (Licence)

5-6

Tri du rsultat : ORDER BY


Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)

Noms, budgets et villes des projets de budget suprieur


250, en ordonnant le rsultat par ordre dcroissant
de budget puis par nom par ordre alphanumrique
croissant ?
SELECT
FROM
WHERE
ORDER BY

Pname, Budget, City


Project
Budget > 250
Budget DESC, Pname

Par dfaut, l'ordre est ascendant (ASC). L'ordre descendant peut tre spcifi
par le mot-cl DESC
Cours Bases de donnes (Licence)

5-7

Oprateurs ensemblistes
UNION, EXCEPT (MINUS), INTERSECT
Les oprandes peuvent tre spcifis par

cration de relations temporaires


ASSIGN TO temp-1
SELECT A1, ..., An
FROM
R1, ..., Rm
WHERE P;
temp-1 UNION temp-2;

ASSIGN
SELECT
FROM
WHERE

TO temp-2
B1, ..., Bn
S1, ..., Sr
Q;

utilisation de parenthses
(SELECT A1, ..., An FROM R1, ..., Rm
WHERE P)
UNION
(SELECTB1, ..., Bn FROM S1, ..., Sr
WHERE Q);

Cours Bases de donnes (Licence)

5-8

Requtes avec oprateurs ensemblistes


Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Villes o il y a soit un employ soit un projet?


(SELECT City FROM Emp)
UNION
(SELECT City FROM Project)

Villes o il y a des employs mais pas de projets?


(SELECT City FROM Emp)
EXCEPT
(SELECT City FROM Project)
Remarque : par dfaut, les oprations ensemblistes liminent les doublons.
Pour garder les doublons, il faut ajouter ALL aprs loprateur.
Oracle : EXCEPT est remplac par MINUS; uniquement UNION ALL est
implant.
Cours Bases de donnes (Licence)

5-9

Requtes avec oprateurs


ensemblistes
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Villes o il y a la fois un employ et un projet?


(SELECT City FROM Emp)
INTERSECT
(SELECT City FROM Project)

Noms des projets et des employs de Paris?


(SELECT
FROM
WHERE
(SELECT
FROM
WHERE
Cours Bases de donnes (Licence)

Ename
Emp
City = Paris)
UNION
Pname
Project
City = Paris)
5-10

SQL : Requtes imbriques


Requte imbrique dans la clause WHERE d'une requte externe:
SELECT
FROM

WHERE [Oprande] Oprateur (SELECT


FROM
WHERE )

Oprateurs ensemblistes :
(A1,An) IN <sous-req> : appartenance ensembliste
EXISTS <sous-req> : test dexistence
(A1,An)<comp> [ALL|ANY] <sous-req> :
comparaison avec quantificateur (ANY par dfaut)

Cours Bases de donnes (Licence)

5-11

Expression IN
SELECT
FROM
WHERE (A1,,An)[NOT] IN (SELECT B1,,Bn
FROM
WHERE )

Smantique : la condition est vraie si le n-uplet


dsign par (A1,, An)de la requte externe
appartient (nappartient pas) au rsultat de la
requte interne.
Cours Bases de donnes (Licence)

5-12

ALL/ANY
SELECT
FROM
WHERE (A1,,An) ALL/ANY (SELECT B1,,Bn
FROM
WHERE )

On peut utiliser une comparaison {<, <=, >, >=, <>} et


ALL () ou ANY (): La condition est alors vraie si la
comparaison est vraie pour tous les n-uplets /au moins un nuplet de la requte interne.
Question: Comment peut-on exprimer IN avec ALL/ANY?
Cours Bases de donnes (Licence)

5-13

Exemple avec IN
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Noms des employs qui travaillent dans des villes o il


y a [ny a pas] des projets de budget infrieur 50?
SELECT Ename
FROM Emp
WHERE City [NOT] IN
(SELECT City
FROM
Project
WHERE Budget < 50)
Cours Bases de donnes (Licence)

5-14

Expression EXISTS

SELECT
Q
FROM
WHERE
(NOT) EXISTS (SELECT *
FROM
WHERE P)

Smantique procdurale : pour chaque n-uplet x de la


requte externe Q, excuter la requte interne Q; s'il existe
au moins un n-uplet y dans le rsultat de la requte interne,
alors slectionner x.
Smantique logique : { x | Q(x) y (Q(y) }
Les deux requtes sont gnralement corrles : P dans la
requte interne Q exprime une jointure entre les tables de Q
et les tables de la requte externe Q.

Cours Bases de donnes (Licence)

5-15

Exemple avec EXISTS


Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Noms des employs qui travaillent dans une ville o il y a un projet?


SELECT Ename FROM
WHERE EXISTS (SELECT
FROM
WHERE

Emp
*
Project
Emp.City=Project.City)

Noms des employs qui travaillent dans une ville sans projet?
SELECT Ename FROM Emp
WHERE NOT EXISTS (SELECT *
FROM
Project
WHERE Emp.City=Project.City)
Cours Bases de donnes (Licence)

5-16

Calcul relationnel et SQL


Requte SQL de base:
SELECT ri.Ao, , rj.Ap
FROM
R1 r1, Ri ri, , Rj rj, , Rk rk
WHERE P(r1, r2, , rk)

Calcul relationnel :

{ (ri.Ao ,, rj.Ap) | rl,..., rk (R1(r1 ) Ri(ri)... Rk(rk )


P(r1,..., rk ) ) }

Rappel: SQL (sans fonctions dagrgation et de groupement)


est quivalent au calcul relationnel sain (et lalgbre
relationnel).
Cours Bases de donnes (Licence)

5-17

Calcul relationnel et SQL


Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Employs qui travaillent dans tous les projets?


Algbre relationnelle : ENO, PNO (Works) PNO (Project)
Calcul relationnel (division) :
{e.Eno | Emp(e) p ( Project(p) w( Works(w)
p.Pno = w.Pno w.Eno= e.Eno ))}
{e.Eno | Emp(e) p (Project(p) w( Works(w)
p.Pno = w.Pno w.Eno= e.Eno ))}

Eliminer : x F(x) x( F(x))


{e | Emp(e) p (Project(p) w( Works(w)
p.Pno = w.Pno w.Eno = e.Eno ))}
Cours Bases de donnes (Licence)

5-18

Calcul relationnel et SQL


Convertir en SQL

Rgle de base: un niveau d'imbrication pour chaque

La requte SQL correspondante est:


SELECT
*
FROM
Emp e
WHERE NOT EXISTS
(SELECT *
FROM
Project p
WHERE NOT EXISTS
(SELECT *
FROM Works w
WHERE p.Pno=w.Pno
AND
e.Eno = w.Eno))
Cours Bases de donnes (Licence)

5-19

Fonctions d'agrgation
Pour calculer une valeur numrique partir d'une
relation

la fonction est applique un attribut


AggFunct : COUNT, SUM, MAX, MIN, AVG
SELECT AggFunc(Ai), , AggFunc(Aj)
FROM
R1, ..., Rm
WHERE P

Cours Bases de donnes (Licence)

5-20

Exemples d'agrgation
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Budgets totaux des projets de Paris?


SELECT
SUM(Budget)
FROM Project
WHERE City = Paris

Nombre de villes o il y a un projet avec l'employ E4?


SELECT
COUNT(DISTINCT City)
FROM Project, Works
WHERE Project.Pno = Works.Pno
AND Works.Eno = E4

Cours Bases de donnes (Licence)

5-21

Fonctions d'agrgation
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Noms des projets dont le budget est suprieur au


budget moyen?
SELECT
FROM
WHERE

Cours Bases de donnes (Licence)

Pname
Project
Budget > [ANY]
(SELECT AVG(Budget)
FROM
Project)

5-22

Requtes de groupement :
GROUP BY
Pour partitionner les n-uplets rsultats en fonction des valeurs
de certains attributs :
SELECT
FROM
WHERE
GROUP BY

Ai, , An, aggr1, aggr2,


R1, , Rm
P
Aj , Ak

Rgles:

tous les attributs Ai, , An dans la clause SELECT qui ne sont


pas impliqus dans une opration d'agrgation doivent tre inclus
dans la clause GROUP BY

GROUP BY peut avoir dautres attributs en plus

Cours Bases de donnes (Licence)

5-23

GROUP BY
SELECT A1, B1, sum(A2)
FROM
R1, R2
WHERE
A1 < 3
GROUP BY A1, B1
R1
A1 A2
2
1
2
3
1
3

6
1
8
3
2
3
R2
B1
a

from

A1 A2 B1
2 6 a
1 1 a
2 8 a
3 3 a
1 2 a
3 3 a

A1 A2
2 6
where 1 1
2 8
1 2

Cours Bases de donnes (Licence)

B1
a
a
a
a

A1 B1
group by

1
2

A2*
a 1
2
6
a 8

select

A1 B1 sum(A2)
3
1
a
14
2 a

5-24

Exemples de groupement
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Numros des projets avec le nombre demploys impliqus


par projet ?
SELECT
FROM
GROUP BY

Pno, Count(Eno)
Works
Pno

Noms des projets avec la dure moyenne et la dure maximale


de participation dun employ par projet ?
SELECT
FROM
WHERE
GROUP BY
Cours Bases de donnes (Licence)

Pname, AVG(Dur), MAX(Dur)


Works, Project
Works.Pno=Project.Pno
Pno, Pname

5-25

Predicats sur des groupes


Pour garder les groupes (partitions) qui satisfont une certaine
condition :
SELECT
FROM
WHERE
GROUP BY
HAVING

Ai, , An
R1, , Rm
P
Aj , Ak
Q

Rgle : La condition Q porte gnralement sur des valeurs


atomiques retournes par un oprateur d'agrgation sur les
attributs qui napparaissent pas dans le GROUP BY

Cours Bases de donnes (Licence)

5-26

Exemples de groupement
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)

Project(Pno, Pname, Budget, City)


Works(Eno, Pno, Resp, Dur)

Villes dans lesquelles habitent plus de 2 employs?


SELECT
FROM
GROUP BY
HAVING

City
Emp
City
COUNT(ENO) > 2

Projets dans lesquels plus de 2 employs partagent une


responsabilit?
SELECT DISTINCT Pno
FROM
Works
GROUP BY Pno, Resp
HAVING
COUNT(DISTINCT ENO) > 2
Cours Bases de donnes (Licence)

5-27

Couplage SQLlangage de
programmation (Embedded SQL)
Permet d'accder une BD depuis un programme
d'application

SQL n'est pas suffisant pour crire des applications


gnrales (SQL nest pas Turing complet)

SQL a des liaisons (bindings) pour diffrents


langages de programmation

PHP, C, C++, Java, Cobol, etc.


les liaisons dcrivent la faon dont des applications
crites dans ces langages htes peuvent interagir avec
un SGBD relationnel

Cours Bases de donnes (Licence)

5-28

Dveloppement d'application
Source Files with
Embedded SQL
Preprocessor
Modified Source
Files

Libraries

Host Language
Compiler
Object Code Files

Other Object Files


& Libraries

Host Language
Linker
Executable
Cours Bases de donnes (Licence)

5-29

Utilisation de Embedded SQL


Interface = commandes EXEC SQL
Utilisation des rsultats de requtes dans un
programme d'application :
dfinition de variables partages (entre SQL et le
langage hte) en utilisant le format du langage
hte
utilisation des variables partages dans les
requtes d'interrogation, de mise jour et de
modification de schma

Cours Bases de donnes (Licence)

5-30

Requte produisant un seul n-uplet


Si la requte retourne toujours un seul n-uplet, chaque
attribut dans la clause SELECT ncessite une variable
partage.
Exemple : retrouver le salaire pour un titre donn :

EXEC SQL BEGIN DECLARE SECTION;


char title[15]; /* entr par l'utilisateur */
real sal;
/* salary */
EXEC SQL END DECLARE SECTION;

/* Code non SQL (omis) pour obtenir title */


EXEC SQL
SELECT Salary INTO :sal
FROM Pay
WHERE Title = :title;
/* Code (omis) pour imprimer le rsultat */

Cours Bases de donnes (Licence)

5-31

Utilisation des Curseurs


Si la requte retourne un ensemble de n-uplets, il faut utiliser un

curseur qui permet daccder successivement aux n-uplets du


rsultat de la requte SQL:
dclarer (declare) le curseur :

ouvrir (open) le curseur :

excution de la requte et gnration du rsultat (vue logique)


positionner le curseur avant le premier n-uplet

rcuprer (fetch) un n-uplet :

associe un identificateur de curseur avec une requte SQL

avancer le curseur (boucle)


affecter des variables avec les valeurs du n-uplet point par le curseur

fermer (close) le curseur.

Cours Bases de donnes (Licence)

5-32

Exemple de curseur
Pour chaque projet employant plus de 2 programmeurs, donner le numro de
projet et la dure moyenne d'affectation des programmeurs

EXEC SQL BEGIN DECLARE SECTION;


char pno[3]; /* project number */
real avg-dur; /* average duration */
EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE duration CURSOR FOR


SELECT Pno, AVG(Dur)
FROM
Works
WHERE Resp = Programmer
GROUP BY Pno
HAVING COUNT(*) > 2;

EXEC SQL OPEN duration;

while(1) {
EXEC SQL FETCH FROM duration INTO :pno, :avg-dur
if(strcmp(SQLSTATE, 02000) then break
else < print the info >
}
EXEC SQL CLOSE duration
Cours Bases
de donnes (Licence)

5-33

PL/SQL dOracle
PL/SQL : langage de programmation procdural intgrant SQL.
Bloc PL/SQL : regroupement logique de dclarations et dordres.
declare
sal number;
begin
SELECT SALARY INTO sal
FROM
PAY
WHERE TITLE = Programmer;
if sal>10 then
UPDATE PAY
SET SALARY = SALARY * 1.1
WHERE TITLE = Programmer;
end if;
COMMIT;
exception
when no_data_found then
INSERT INTO ERROR values (TITLE inexistant);
Cours Bases de donnes (Licence)

5-34

Traitement de PL/SQL
Moteur PL/SQL
Bloc
PL/SQL

Analyse

Procdural

Excution
procdurale

SQL

Serveur Oracle

Cours Bases de donnes (Licence)

5-35

Das könnte Ihnen auch gefallen