Copyright Oracle Corporation, 1997. Tous droits réservés. 7 7 Sous-Interrogations www.TelechargerCours.com
Copyright Oracle Corporation, 1997. Tous droits réservés.
77
Sous-Interrogations
www.TelechargerCours.com
7-2 Copyright Oracle Corporation, 1997. Tous droits réservés.
Objectifs
A la fin de ce chapitre, vous saurez :A la fin de ce chapitre, vous saurez :
• Décrire les types de problèmes que les sous-interrogations peuvent résoudre
• Définir des sous-interrogations
• Enumérer les types de sous-interrogations
• Ecrire des sous-interrogations mono-ligne et multi-ligne
www.TelechargerCours.com
7-3 Copyright Oracle Corporation, 1997. Tous droits réservés.
DéfinitionUne Sous-interrogation est un ordre SELECT Une Sous-interrogation est un ordre SELECT imbriqué dans une clause d’un autre ordre imbriqué dans une clause d’un autre ordre SELECT .SELECT .
Elles permettent de sélectionner des lignes d’une Elles permettent de sélectionner des lignes d’une table lorsque la condition dépend des données table lorsque la condition dépend des données de la table elle-même . de la table elle-même .
Peuvent être placées dans les clauses SQL Peuvent être placées dans les clauses SQL suivantes :suivantes :
WHEREWHERE
HAVINGHAVING
FROMFROM
www.TelechargerCours.com
7-4 Copyright Oracle Corporation, 1997. Tous droits réservés.
Utilisation d'une Sous-Interrogation pour Résoudre un Problème
"Qui a un salaire supérieur à celui de Jones ?""Qui a un salaire supérieur à celui de Jones ?"
"Quel employé a un salaire supérieur à celui de Jones ?"
Requête principale
??
"Quel est le salaire de Jones ?"??
sous-interrogation
www.TelechargerCours.com
7-5 Copyright Oracle Corporation, 1997. Tous droits réservés.
Sous-Interrogations
• La sous-interrogation (requête interne) est exécutée une fois avant la requête principale.
• Le résultat de la sous-interrogation est utilisé par la requête principale (externe).
SELECT select_listFROM tableWHERE expr operator
(SELECT select_list FROM table);
www.TelechargerCours.com
7-6 Copyright Oracle Corporation, 1997. Tous droits réservés.
2975
SQL> SELECT ename 2 FROM emp 3 WHERE sal > 4 (SELECT sal 5 FROM emp 6 WHERE empno=7566);
Utilisation d'une Sous-Interrogation
ENAME----------KINGFORDSCOTT
ENAME----------KINGFORDSCOTT
www.TelechargerCours.com
7-7 Copyright Oracle Corporation, 1997. Tous droits réservés.
Conventions d'Utilisation des Sous-Interrogations
• Placez les sous-interrogations entre parenthèses.
• Placez les sous-interrogations à droite de l'opérateur de comparaison.
• N'ajoutez jamais de clause ORDER BY à une sous-interrogation.
• Utilisez les opérateurs mono-ligne avec les sous-interrogations mono-ligne.
• Utilisez les opérateurs multi-ligne avec les sous-interrogations multi-ligne.
7-8 Copyright Oracle Corporation, 1997. Tous droits réservés.
Types de Sous-Interrogations
• Sous-interrogation mono-ligneRequête principale
sous-interrogation ramèneramène
CLERKCLERK
• Sous-interrogation multi-ligne
CLERKCLERKMANAGERMANAGER
Requête principale
ramèneramène
• Sous-interrogation multi-colonne
CLERK 7900CLERK 7900MANAGER 7698MANAGER 7698
Requête principale
ramèneramène
sous-interrogation
sous-interrogation
7-9 Copyright Oracle Corporation, 1997. Tous droits réservés.
Sous-Interrogations Mono-ligne
• Ne ramènent qu'une seule ligne
• Utilisent des opérateurs de comparaison mono-ligne
Opérateur
=
>
>=
<
<=
<>
Signification
Egal à
Supérieur à
Supérieur ou égal à
Inférieur à
Inférieur ou égal à
Différent de
7-10 Copyright Oracle Corporation, 1997. Tous droits réservés.
Sous-Interrogations Mono-ligne
Afficher les employés occupant le même poste que l’employé No. 7369 ?
SELECT ename, job FROM emp WHERE job = ( SELECT job
FROM emp WHERE empno=7369 );
7-11 Copyright Oracle Corporation, 1997. Tous droits réservés.
Exécution de Sous-Interrogations Mono-ligne
CLERK
1100
ENAME JOB---------- ---------MILLER CLERK
ENAME JOB---------- ---------MILLER CLERK
SQL> SELECT ename, job 2 FROM emp 3 WHERE job = 4 (SELECT job 5 FROM emp 6 WHERE empno = 7369) 7 AND sal > 8 (SELECT sal 9 FROM emp 10 WHERE empno = 7876);
7-12 Copyright Oracle Corporation, 1997. Tous droits réservés.
Utilisation de Fonctions de Groupe dans une Sous-
Interrogation800
ENAME JOB SAL---------- --------- ---------SMITH CLERK 800
ENAME JOB SAL---------- --------- ---------SMITH CLERK 800
SQL> SELECT ename, job, sal 2 FROM emp 3 WHERE sal = 4 (SELECT MIN(sal) 5 FROM emp);
www.TelechargerCours.com
7-13 Copyright Oracle Corporation, 1997. Tous droits réservés.
Clause HAVING avec Sous-Interrogations
• Oracle Server exécute les sous-interrogations en premier.
• Oracle Server ramène les résultats dans la clause HAVING de la requête principale.
800
SQL> SELECT deptno, MIN(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING MIN(sal) > 5 (SELECT MIN(sal) 6 FROM emp 7 WHERE deptno = 20);
7-14 Copyright Oracle Corporation, 1997. Tous droits réservés.
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 )
www.TelechargerCours.com
7-15 Copyright Oracle Corporation, 1997. Tous droits réservés.
Qu'est-ce Qui ne Va pas dans cet Ordre ?
ERROR:ORA-01427: single-row sub-query returns more thanone row
no rows selected
ERROR:ORA-01427: single-row sub-query returns more thanone row
no rows selected
SQL> SELECT empno, ename 2 FROM emp 3 WHERE sal = 4 (SELECT MIN(sal) 5 FROM emp 6 GROUP BY deptno);
Opérat
eur m
ono-ligne
avec
sous-
inte
rrogat
ion m
ulti-li
gne
Opérat
eur m
ono-ligne
avec
sous-
inte
rrogat
ion m
ulti-li
gnewww.TelechargerCours.com
7-16 Copyright Oracle Corporation, 1997. Tous droits réservés.
Cet Ordre Va-t-il Fonctionner ?
no rows selectedno rows selected
La so
us-in
terro
gatio
n ne
ram
ène
aucu
ne va
leur
La so
us-in
terro
gatio
n ne
ram
ène
aucu
ne va
leur
SQL> SELECT ename, job 2 FROM emp 3 WHERE job = 4 (SELECT job 5 FROM emp 6 WHERE ename='SMYTHE');
www.TelechargerCours.com
7-17 Copyright Oracle Corporation, 1997. Tous droits réservés.
Sous-Interrogation Multi-ligne
• Ramène plusieurs lignes
• Utilise des opérateurs de comparaison multi-ligne
Opérateur
IN
ANY
ALL
Signification
Egal à un élément quelconque de la liste
Compare la valeur à chaque valeur
ramenée par la sous-interrogation
Compare la valeur à toutes les valeurs
ramenées par la sous-interrogation
www.TelechargerCours.com
7-18 Copyright Oracle Corporation, 1997. Tous droits réservés.
Exemple• Trouver les employés qui gagnent
l’équivalent d’un salaire minimum de département .
SELECT ename, sal, deptno FROM emp WHERE sal
( SELECT MIN(sal)FROM empGROUP B deptno )
IN
www.TelechargerCours.com
7-19 Copyright Oracle Corporation, 1997. Tous droits réservés.
Utilisation de l'Opérateur ANY dans les Sous-Interrogations Multi-
ligne
9508001100
1300
EMPNO ENAME JOB--------- ---------- --------- 7654 MARTIN SALESMAN 7521 WARD SALESMAN
EMPNO ENAME JOB--------- ---------- --------- 7654 MARTIN SALESMAN 7521 WARD SALESMAN
SQL> SELECT empno, ename, job 2 FROM emp 3 WHERE sal < ANY 4 (SELECT sal 5 FROM emp 6 WHERE job = 'CLERK') 7 AND job <> 'CLERK';
www.TelechargerCours.com
7-20 Copyright Oracle Corporation, 1997. Tous droits réservés.
Utilisation de l'Opérateur ALL dans les Sous-Interrogations Multi-ligne
2916.6667
21751566.6667
EMPNO ENAME JOB--------- ---------- --------- 7839 KING PRESIDENT 7566 JONES MANAGER 7902 FORD ANALYST 7788 SCOTT ANALYST
EMPNO ENAME JOB--------- ---------- --------- 7839 KING PRESIDENT 7566 JONES MANAGER 7902 FORD ANALYST 7788 SCOTT ANALYST
SQL> SELECT empno, ename, job 2 FROM emp 3 WHERE sal > ALL 4 (SELECT avg(sal) 5 FROM emp 6 GROUP BY deptno)
7-21 Copyright Oracle Corporation, 1997. Tous droits réservés.
Résumé
Les sous-interrogations sont utiles Les sous-interrogations sont utiles lorsqu'une requête fait appel à des valeurs lorsqu'une requête fait appel à des valeurs inconnues.inconnues.SELECT select_listFROM tableWHERE expr operator
(SELECT select_list FROM table);
www.TelechargerCours.com