Vous êtes sur la page 1sur 22

6

Sous-interrogations

Copyright Oracle Corporation, 2001. Tous droits rservs.

Objectifs
A la fin de ce chapitre, vous pourrez :

dcrire les types de problme que les

sous-interrogations permettent de rsoudre

dfinir des sous-interrogations


numrer les types de sous-interrogation
crire des interrogations monolignes et multilignes

6-2

Copyright Oracle Corporation, 2001. Tous droits rservs.

Rsoudre un problme
l'aide d'une sous-interrogation
Qui touche un salaire suprieur celui d'Abel ?
Interrogation principale :

Quels employs touchent un salaire


suprieur celui d'Abel ?
Sous-interrogation :

6-3

Quel est le salaire d'Abel ?

Copyright Oracle Corporation, 2001. Tous droits rservs.

Syntaxe des sous-interrogations


SELECT
FROM
WHERE

6-4

select_list
table
expr operator
(SELECT
FROM

select_list
table);

La sous-interrogation (interrogation interne)


s'excute une fois avant l'interrogation principale.
L'interrogation principale (interrogation externe)
utilise le rsultat de la sous-interrogation.

Copyright Oracle Corporation, 2001. Tous droits rservs.

Utiliser une sous-interrogation


SELECT last_name
FROM
employees 11000
WHERE salary >
(SELECT salary
FROM
employees
WHERE last_name = 'Abel');

6-5

Copyright Oracle Corporation, 2001. Tous droits rservs.

Rgles d'utilisation des


sous-interrogations
Placez les sous-interrogations entre parenthses.
Placez les sous-interrogations dans la partie droite
de la condition de comparaison.

La clause ORDER BY de la sous-interrogation n'est

requise que si vous effectuez une analyse de type


n-premiers.

Utilisez des oprateurs monolignes dans les

sous-interrogations monolignes et des oprateurs


multilignes dans les sous-interrogations
multilignes.

6-6

Copyright Oracle Corporation, 2001. Tous droits rservs.

Types de sous-interrogation

Sous-interrogation monoligne
Interrogation
principale

Sousinterrogation

renvoie

ST_CLERK

Sous-interrogation multiligne
Interrogation
principale

Sousinterrogation

6-7

renvoie

ST_CLERK
SA_MAN

Copyright Oracle Corporation, 2001. Tous droits rservs.

Sous-interrogations monolignes
Renvoient une seule ligne
Utilisent des oprateurs de comparaison monolignes
Oprateur Signification

6-8

Egal

>

Suprieur

>=

Suprieur ou gal

<

Infrieur

<=

Infrieur ou gal

<>

Diffrent de

Copyright Oracle Corporation, 2001. Tous droits rservs.

Excuter des sous-interrogations


monolignes
SELECT last_name, job_id, salary
FROM
employees
ST_CLERK
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE employee_id = 141)
2600
AND
salary >
(SELECT salary
FROM
employees
WHERE employee_id = 143);

6-9

Copyright Oracle Corporation, 2001. Tous droits rservs.

Utiliser des fonctions de groupe dans une


sous-interrogation
SELECT last_name, job_id, salary
2500
FROM
employees
WHERE salary =
(SELECT MIN(salary)
FROM
employees);

6-10

Copyright Oracle Corporation, 2001. Tous droits rservs.

Clause HAVING et sous-interrogations


Le serveur Oracle excute d'abord les
sous-interrogations.

Le serveur Oracle renvoie les rsultats dans la


clause HAVING de l'interrogation principale.

SELECT
FROM
GROUP BY
HAVING

6-11

department_id, MIN(salary)
employees
department_id
2500
MIN(salary) >
(SELECT MIN(salary)
FROM
employees
WHERE department_id = 50);

Copyright Oracle Corporation, 2001. Tous droits rservs.

Clause HAVING et sous-interrogations


Exemple
Recherchez le poste qui prsente le salaire moyen
le plus faible.

6-12

Copyright Oracle Corporation, 2001. Tous droits rservs.

Erreurs dans les sous-interrogations

SELECT employee_id, last_name


FROM
employees
WHERE salary =
(SELECT
MIN(salary)
FROM
employees
GROUP BY department_id);
ERROR
ERROR at
at line
line 4:
4:
ORA-01427:
ORA-01427: single-row
single-row subquery
subquery returns
returns more
more than
than
one
one row
row

Oprateur monoligne dans une sous-interrogation multiligne


6-13

Copyright Oracle Corporation, 2001. Tous droits rservs.

Problmes lis aux sous-interrogations

SELECT last_name, job_id


FROM
employees
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Haas');
no
no rows
rows selected
selected

La sous-interrogation ne renvoie aucune valeur

6-14

Copyright Oracle Corporation, 2001. Tous droits rservs.

Sous-interrogations multilignes
Renvoient plusieurs lignes
Utilisent des oprateurs de comparaison multilignes
Oprateur
IN

Egal n'importe quel membre de la liste

ANY

Compare la valeur chaque valeur


renvoye par la sous-interrogation

ALL

6-15

Signification

Compare la valeur toutes les valeurs


renvoyes par la sous-interrogation

Copyright Oracle Corporation, 2001. Tous droits rservs.

Sous-interrogations multilignes
Exemple

6-16

Recherchez les employs qui touchent le salaire


minimal dans chaque service.

Copyright Oracle Corporation, 2001. Tous droits rservs.

Utiliser l'oprateur ANY dans


les sous-interrogations multilignes
SELECT employee_id, last_name, job_id, salary
9000, 6000, 4200
FROM
employees
WHERE salary < ANY
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

6-17

Copyright Oracle Corporation, 2001. Tous droits rservs.

Utiliser l'oprateur ALL dans


les sous-interrogations multilignes
SELECT employee_id, last_name, job_id, salary
FROM
employees
9000, 6000, 4200
WHERE salary < ALL
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

6-18

Copyright Oracle Corporation, 2001. Tous droits rservs.

Afficher les employs qui ont des subordonns

Afficher les employs qui nont pas des


subordonns

6-19

Copyright Oracle Corporation, 2001. Tous droits rservs.

Valeurs NULL dans une


sous-interrogation
SELECT emp.last_name
FROM
employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM
employees mgr);
no rows selected

6-20

Copyright Oracle Corporation, 2001. Tous droits rservs.

Synthse
Ce chapitre vous permis d'apprendre :
dterminer quand une sous-interrogation peut
aider rsoudre un problme
crire des sous-interrogations lorsqu'une
interrogation est base sur des valeurs inconnues
SELECT
FROM
WHERE

6-21

select_list
table
expr operator
(SELECT select_list
FROM
table);

Copyright Oracle Corporation, 2001. Tous droits rservs.

Prsentation de l'exercice 6
Dans cet exercice, vous allez :

crer des sous-interrogations pour interroger des


valeurs bases sur un critre inconnu,

utiliser des sous-interrogations pour dterminer


quelles valeurs existent dans un ensemble de
donnes et pas dans un autre.

6-22

Copyright Oracle Corporation, 2001. Tous droits rservs.