Vous êtes sur la page 1sur 16

1

Le langage SQL
2

SQL

Voir polycopié:
Introduction à SQL
3

SQL – Les sous requêtes

Afficher les employés dont les salaires sont inférieurs à 900 ?


SELECT * FROM emp WHERE sal<900 ;
Afficher les employés dont les salaires sont inférieurs à la moyenne
des salaires du département 10 ?
SELECT * FROM emp WHERE sal< X ;

 SELECT AVG(sal) FROM emp WHERE deptno=10

Solution:
SELECT * FROM emp
WHERE sal<(SELECT AVG(sal) FROM emp
WHERE deptno=10);
4

SQL – Les sous requêtes

 Exécution
SELECT * FROM emp
WHERE sal<(SELECT AVG(sal) FROM emp
WHERE deptno=10);
1- Exécution de la sous-requête
SELECT * FROM emp
WHERE sal<2916,66;
2- Exécution de la requête principale
...
5

SQL – Les sous requêtes

 Règles d’utilisation d’une Sous-Requête


SELECT * FROM emp
WHERE sal<(SELECT sal FROM emp
WHERE deptno=10);
La sous-requête renvoie une relation à une colonne et à plusieurs lignes.
Peut-on comparer une valeur de sal à plusieurs valeurs de sal via l’opérateur < ?
NON !
Dans ce cas (<), la sous-requête doit renvoyer une seule valeur, soit une relation à
une colonne et à une ligne.
6

SQL – Les sous requêtes

 Plus généralement:
SELECT colonne(s) FROM table
WHERE exp(s) OPERATEUR (SELECT col(s) FROM table);
Afficher les employés ayant
le même job et salaire que
Une ligne et une colonne Une ligne et SMITH ?
plusieurs
colonnes
Afficher les employés qui
=, !=,>,≥,<,≤ =, != Afficher les employés les
travaillent dans les mêmes
moins payés dans chaque
Plusieurs départements
lignes et uneque SMITH,
Plusieurs lignesdépartement?
et
ALEN et KING ?
colonne plusieurs colonnes
[NOT] IN [NOT] IN
(=, !=,>,≥,<,≤) ANY/ALL
7

SQL – Les sous requêtes

 Les mots clé ANY et ALL


- Les SR qui produisent plusieurs lignes sont utilisées avec les opérateurs suivants :

 IN, la condition est vraie si notre exp est égale à l’une des lignes retournées par
la SR.
 op ANY, la condition est vraie si la comparaison (en utilisant l’opérateur op) est
vraie pour n’importe quelle valeur de la relation résultante.
 op ALL suivie d’une liste de valeurs, la condition est vraie si la comparaison (en
utilisant l’opérateur op) est vraie pour toute valeur de la relation résultante.

Afficher les employés qui sont mieux payés que n’importe quel
employé du département 10 ?
SELECT * FROM emp
WHERE sal >ANY (SELECT sal FROM emp WHERE deptno=10);
8

SQL – Les sous requêtes

 Les mots clé ANY et ALL


- Les SR qui produisent plusieurs lignes sont utilisées avec les opérateurs suivants :

 IN, la condition est vraie si notre exp est égale à l’une des lignes retournées par
la SR.
 op ANY, la condition est vraie si la comparaison (en utilisant l’opérateur op) est
vraie pour n’importe quelle valeur de la relation résultante.
 op ALL suivie d’une liste de valeurs, la condition est vraie si la comparaison (en
utilisant l’opérateur op) est vraie pour toute valeur de la relation résultante.

Afficher les employés qui sont mieux payés que tous les employés du
département 10 ?
SELECT * FROM emp
WHERE sal >ALL (SELECT sal FROM emp WHERE deptno=10);
9

SQL – Les sous requêtes

 Les Sous-Requêtes corrélées

- Afficher chaque employé dont le salaire est supérieur à la moyenne des


salaires de son département?
SELECT * FROM emp X
WHERE X.sal> (SELECT
(salaire moyenne
AVG(sal)du
FROM
département
emp Y de l’employé fixé)
WHERE Y.deptno=X.deptno);

 Exécution
1- La requête principale fixe une ligne de la table EMP, c’est une ligne dite candidate.
2- Ayant maintenant X.DEPTNO, la sous-requête est exécutée.
3- La condition de la clause WHERE de la requête principale est évaluée, la ligne est
retournée ou non suivant la valeur de la condition (TRUE ou FALSE).
4- Itération des étapes 1, 2 et 3 pour les lignes restantes de la table EMP.
10

SQL – Les sous requêtes

 Exécution
SELECT * FROM emp X
WHERE sal>
(SELECT AVG(sal) FROM emp Y
WHERE X.deptno=Y.deptno);

SELECT * FROM emp X


WHERE sal>
(SELECT AVG(sal) FROM emp Y
WHERE Y.deptno=20);

SELECT * FROM emp X


WHERE sal> 2175;
11

SQL – Les sous requêtes

 Exécution
SELECT * FROM emp X
WHERE sal>
(SELECT AVG(sal) FROM emp Y
WHERE X.deptno=Y.deptno);

SELECT * FROM emp X


WHERE sal>
(SELECT AVG(sal) FROM emp Y
WHERE Y.deptno=30);

SELECT * FROM emp X


WHERE sal> 1566,66;
12

SQL – Les sous requêtes

 La division
- Afficher les a qui sont en relation avec tous les b de S ?

D  a  R[A]/b  S, (a,b)  R  a  R[A]/b  S, (a,b)  R

- Pour savoir si a1 est en relation avec tous les b de S, on peut calculer ceci pour
a1:
{Tous les b de S} MINUS {Les b en relation avec a1} = Ø

R
SELECT A FROM R X S
A B
WHERE NOT EXISTS(SELECT B FROM S B
MINUS a1 b1
SELECT B FROM R Y a1 b2 ÷B b1
WHERE Y.A=X.A); b2
a2 b2
13

SQL – Les sous requêtes

 La division
- Afficher les a qui sont en relation avec tous les b de S ?

SELECT A FROM R X
WHERE NOT EXISTS(SELECT B FROM S
MINUS
SELECT B FROM R Y
WHERE Y.A=X.A);
R
S
A B
B
{b1,b2} / {b1,b2}= Ø a1 b1
{b1,b2} / {b1,b2}= Ø a1 b2 ÷B b1
b2
{b1,b2} / {b2}= {b1} a2 b2
14

SQL – Les sous requêtes

 La division – un autre exemple


F (NF, NOMF, VILLEF) /*Table des fournisseurs*/
P (NP, NOMP, COULEUR, POIDS, VILLEP) /*Table des pièces*/
J (NJ, NOMJ, DLANC, VILLEJ) /*Table des projets*/
FPJ (NF, NJ, NP, QTE, DLIV) /*Table association qui inclut une livraison faite par un
Feur NF d’une quantité QTE d’une pièce NP pour un projet NJ à une date DLIV*/

FPJ
NF NJ NP P J F
F1 J1 P2 NP NJ NF
F2 J3 P5 P2 J1 F1
F3 J1 P5 P5 J3 F2
F2 J1 P2 F3
15

SQL – Les sous requêtes

 La division – un autre exemple


- Afficher les codes de fournisseurs qui ont livré toutes les pièces?

SELECT NF FROM FPJ X


WHERE NOT EXISTS(SELECT NP FROM P
MINUS
SELECT NP FROM FPJ Y
FPJ WHERE Y.NF=X.NF);
NF NJ NP
P J F
F1 J1 P2
NP NJ NF
F2 J3 P5
P2 J1 F1
F3 J1 P5
P5 J3 F2
F2 J1 P2
F3
16

SQL – Les sous requêtes

 La division – un autre exemple


SELECT NF FROM FPJ X
WHERE NOT EXISTS(SELECT NP FROM P
MINUS
NF NJ NP
F1 J1 P2
SELECT NP FROM FPJ Y
F2 J3 P5 FPJ Y WHERE Y.NF=X.NF);
F3 J1 P5 FPJ X
F2 J1 P2
NF NJ NP
P J F
{P2,P5} / {P2}= {P5} F1 J1 P2
NP NJ NF
{P2,P5} / {P2,P5}= Ø F2 J3 P5
P2 J1 F1
{P2,P5} / {P5}= {P2} F3 J1 P5
P5 J3 F2
{P2,P5} / {P2,P5}= Ø F2 J1 P2
F3

Vous aimerez peut-être aussi