Vous êtes sur la page 1sur 20

7

Sous-Interrogations

Copyright Oracle Corporation, 1997. Tous droits rservs.


Objectifs

A la fin de ce chapitre, vous saurez :


Dcrire les types de problmes que les
sous-interrogations peuvent rsoudre
Dfinir des sous-interrogations
Enumrer les types de sous-
interrogations
Ecrire des sous-interrogations mono-
ligne et multi-ligne

7-2 Copyright Oracle Corporation, 1997. Tous droits rservs.


Dfinition
Une Sous-interrogation est un ordre SELECT
imbriqu dans une clause dun autre ordre
SELECT .
Elles permettent de slectionner des lignes dune
table lorsque la condition dpend des donnes
de la table elle-mme .
Peuvent tre places dans les clauses SQL
suivantes :
WHERE
HAVING
FROM

7-3 Copyright Oracle Corporation, 1997. Tous droits rservs.


Utilisation d'une Sous-Interrogation
pour Rsoudre un Problme
"Qui a un salaire suprieur celui de Jones ?"

Requte principale

"Quel employ a un salaire suprieur


? celui de Jones ?"

sous-interrogation

?
"Quel est le salaire de Jones ?"

7-4 Copyright Oracle Corporation, 1997. Tous droits rservs.


Sous-Interrogations
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

La sous-interrogation (requte interne)


est excute une fois avant la requte
principale.
Le rsultat de la sous-interrogation est
utilis par la requte principale
(externe).
7-5 Copyright Oracle Corporation, 1997. Tous droits rservs.
Utilisation d'une Sous-Interrogation
SQL> SELECT ename
2 FROM emp 2975
3 WHERE sal >
4 (SELECT sal
5 FROM emp
6 WHERE empno=7566);

ENAME
----------
KING
FORD
SCOTT

7-6 Copyright Oracle Corporation, 1997. Tous droits rservs.


Conventions d'Utilisation des
Sous-Interrogations
Placez les sous-interrogations entre
parenthses.
Placez les sous-interrogations droite
de l'oprateur de comparaison.
N'ajoutez jamais de clause ORDER BY
une sous-interrogation.
Utilisez les oprateurs mono-ligne avec
les sous-interrogations mono-ligne.
Utilisez les oprateurs multi-ligne avec
les sous-interrogations multi-ligne.
7-7 Copyright Oracle Corporation, 1997. Tous droits rservs.
Types de Sous-Interrogations
Sous-interrogation mono-ligne
Requte principale
ramne
sous-interrogation CLERK

Sous-interrogation multi-ligne
Requte principale
ramne CLERK
sous-interrogation
MANAGER
Sous-interrogation multi-colonne
Requte principale
ramne
sous-interrogation CLERK 7900
MANAGER 7698
7-8 Copyright Oracle Corporation, 1997. Tous droits rservs.
Sous-Interrogations Mono-ligne
Ne ramnent qu'une seule ligne
Utilisent des oprateurs de
comparaison mono-ligne
Oprateur Signification

= Egal

> Suprieur

>= Suprieur ou gal

< Infrieur

<= Infrieur ou gal

<> Diffrent de

7-9 Copyright Oracle Corporation, 1997. Tous droits rservs.


Excution de Sous-Interrogations
Mono-ligne
SQL> SELECT ename, job
2 FROM emp
3 WHERE job = CLERK
4 (SELECT job
5 FROM emp
6 WHERE empno = 7369)
7 AND sal > 1100
8 (SELECT sal
9 FROM emp
10 WHERE empno = 7876);

ENAME JOB
---------- ---------
MILLER CLERK

7-10 Copyright Oracle Corporation, 1997. Tous droits rservs.


Utilisation de Fonctions de
Groupe dans une Sous-
Interrogation
SQL> SELECT ename, job, sal
800
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp);

ENAME JOB SAL


---------- --------- ---------
SMITH CLERK 800

7-11 Copyright Oracle Corporation, 1997. Tous droits rservs.


Clause HAVING avec Sous-
Interrogations
Oracle Server excute les sous-
interrogations en premier.
Oracle Server ramne les rsultats dans
la clause HAVING de la requte
principale.
SQL> SELECT deptno, MIN(sal)
2 FROM emp
3 GROUP BY deptno
800
4 HAVING MIN(sal) >
5 (SELECT MIN(sal)
6 FROM emp
7 WHERE deptno = 20);

7-12 Copyright Oracle Corporation, 1997. Tous droits rservs.


Exemple

Trouver le poste ayant le salaire moyen


le moins lev .
SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal) =
( SELECT MIN(AVG(sal))
FROM emp
GROUP B job )

7-13 Copyright Oracle Corporation, 1997. Tous droits rservs.


Qu'est-ce Qui ne Va pas dans
cet Ordre ?
SQL> SELECT empno, ename
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp
6 GROUP BY deptno);

ERROR:
ORA-01427: single-row sub-query returns more than
one row

no rows selected

7-14 Copyright Oracle Corporation, 1997. Tous droits rservs.


Cet Ordre Va-t-il Fonctionner ?

SQL> SELECT ename, job


2 FROM emp
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE ename='SMYTHE');

no rows selected

7-15 Copyright Oracle Corporation, 1997. Tous droits rservs.


Sous-Interrogation Multi-ligne
Ramne plusieurs lignes
Utilise des oprateurs de comparaison
multi-ligne
Oprateur Signification

IN Egal un lment quelconque de la liste

ANY Compare la valeur chaque valeur


ramene par la sous-interrogation

Compare la valeur toutes les valeurs


ALL
ramenes par la sous-interrogation

7-16 Copyright Oracle Corporation, 1997. Tous droits rservs.


Exemple
Trouver les employs qui gagnent
lquivalent dun salaire minimum de
dpartement .

7-17 Copyright Oracle Corporation, 1997. Tous droits rservs.


Utilisation de l'Oprateur ANY
dans les Sous-Interrogations Multi-
ligne
SQL> SELECT empno, ename, job 1300
2 FROM emp 1100
800
3 WHERE sal < ANY 950
4 (SELECT sal
5 FROM emp
6 WHERE job = 'CLERK')
7 AND job <> 'CLERK';

EMPNO ENAME JOB


--------- ---------- ---------
7654 MARTIN SALESMAN
7521 WARD SALESMAN

7-18 Copyright Oracle Corporation, 1997. Tous droits rservs.


Utilisation de l'Oprateur ALL dans
les Sous-Interrogations Multi-ligne

SQL> SELECT empno, ename, job 1566.6667


2 FROM emp 2175
2916.6667
3 WHERE sal > ALL
4 (SELECT avg(sal)
5 FROM emp
6 GROUP BY deptno)

EMPNO ENAME JOB


--------- ---------- ---------
7839 KING PRESIDENT
7566 JONES MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST

7-19 Copyright Oracle Corporation, 1997. Tous droits rservs.


Rsum
Les sous-interrogations sont utiles
lorsqu'une requte fait appel des valeurs
inconnues.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

7-20 Copyright Oracle Corporation, 1997. Tous droits rservs.