Sous-interrogations
Objectifs
A la fin de ce chapitre, vous pourrez :
• décrire les types de problème que les
sous-interrogations permettent de résoudre
• définir des sous-interrogations
• énumérer les types de sous-interrogation
• écrire des interrogations monolignes et
multilignes
Résoudre un problème
à l'aide d'une sous-interrogation
Qui touche un salaire supérieur à celui d'Abel ?
Interrogation principale :
Quels employés touchent un salaire
? supérieur à celui d'Abel ?
Sous-interrogation :
?
Quel est le salaire d'Abel ?
Syntaxe des sous-interrogations
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
• Vous pouvez, par exemple, placer une sous-
interrogation dans les clauses suivantes :
-Clause WHERE
-Clause HAVING
-Clause FROM
-Clause SELECT
• La sous-interrogation (interrogation interne)
s'exécute une fois avant l'interrogation principale.
• L'interrogation principale (interrogation externe)
utilise le résultat de la sous-interrogation.
Utiliser une sous-interrogation
SELECT last_name
FROM employees 11000
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
Règles d'utilisation des
sous-interrogations
• Placez les sous-interrogations entre parenthèses.
• Placez les sous-interrogations dans la partie droite
de la condition de comparaison.
• Utilisez des opérateurs monolignes dans les
sous-interrogations monolignes et des opérateurs
multilignes dans les sous-interrogations
multilignes.
Types de sous-interrogation
• Sous-interrogation monoligne
Interrogation
principale
Sous- renvoie
interrogation ST_CLERK
• Sous-interrogation multiligne
Interrogation
principale
Sous- renvoie ST_CLERK
interrogation SA_MAN
Sous-interrogations monolignes
• Renvoient une seule ligne
• Utilisent des opérateurs de comparaison monolignes
Opérateur Signification
= Egal à
> Supérieur à
>= Supérieur ou égal à
< Inférieur à
<= Inférieur ou égal à
<> Différent de
Exécuter des sous-interrogations
monolignes
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = ST_CLERK
(SELECT job_id
FROM employees
WHERE employee_id = 141)
AND salary > 2600
(SELECT salary
FROM employees
WHERE employee_id = 143);
Utiliser des fonctions de groupe dans une
sous-interrogation
SELECT last_name, job_id, salary
FROM employees 2500
WHERE salary =
(SELECT MIN(salary)
FROM employees);
Clause HAVING et sous-interrogations
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
2500
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
Erreurs dans les sous-interrogations
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
ERROR at line 4:
ORA-01427: single-row subquery returns more than
one row
Problèmes liés aux sous-interrogations
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');
no rows selected
Sous-interrogations multilignes
• Renvoient plusieurs lignes
• Utilisent des opérateurs de comparaison multilignes
Opérateur Signification
IN Egal à n'importe quel membre de la liste
ANY Compare la valeur à chaque valeur
renvoyée par la sous-interrogation
Compare la valeur à toutes les valeurs
ALL
renvoyées par la sous-interrogation
Utiliser l'opérateur ANY dans
les sous-interrogations multilignes
SELECT employee_id, last_name, job_id, salary
FROM employees 9000, 6000, 4200
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
…
Utiliser l'opérateur 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';
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
Requêtes imbriquées multiples
• Une sous requête peut contenir d'autres sous
requêtes imbriquées
• Ex : Ensemble des clients ayant commandé le
produit "50"
SELECT code_client, societe, contact, ville
FROM clients
WHERE code_Client IN
(SELECT code_client FROM commandes WHERE n_Commande IN
(SELECT n_Commande FROM details_commandes
WHERE ref_produit=’50’)) ;
Sous-requêtes vide, non vide
• Le prédicat EXISTS permet de tester l'existence ou
l'absence de données dans la sous-requête.
Si la sous-requête renvoie au moins une ligne le
prédicat est vrai. Dans le cas contraire le prédicat
à valeur fausse. Le prédicat EXISTS peut être
combiné avec l'opérateur de négation NOT.
• Ex : le total des stagiaires du complexe, à
condition qu'il y ait au moins une classe contenant
au moins 20 personnes :
Select count(*) from stagiaire
where exists (select id_class from stagiaire
group by id_class having count(*) 20)
Requêtes corrélées
• Une sous-requête corrélée est une sous-requête
qui s'exécute pour chaque ligne de la requête
principale et non une fois pour toute. Pour arriver
à un tel résultat, il suffit de faire varier une
condition en rappelant dans la sous-requête la
valeur d'une colonne de la requête principale.
Select sub.employee_id from employees sub
where sub.hire_date < (select sup.hire_date
from employees sup
Where sub.manager_id=sup.employee_id);
Méthode 2 auto jointure (méthode prédicative):
Select sub.employee_id from employees sub, employees sup
Where sub.manager_id=sup.employee_id
And sub.hire_date<sup.hire_date;
Méthode prédicative/ensembliste
• La méthode prédicative(jointures) :la requête
comporte une seule instruction SELECT qui traite
plusieurs tables dont la liste apparaît dans la clause
FROM.
• La méthode ensembliste réalise l’intersection de
deux ensembles et s’exprime sous forme de
requêtes imbriquées.
1er methode ensembliste:
Select last_name from employees
where department_id in (select department_id
from departments where department_name like ‘%MA%’)
2eme methode predicative:
Select last_name from employees, departments
Where employees.department_id=departments.department_id
And department_name like ‘%MA%‘
Méthode prédicative/ensembliste
• Exemple de Jointure entre trois table:
1er methode predicative:
Select last_name from employees, departments, location
Where employees.department_id=departments.department_id
And departments.location_d=locations.location_id
And city =‘torento’
2eme methode ensembliste:
Select last_name from employees
where department_id in (select department_id
from departments where location_id in (select location_id
From locations where city =‘torento’));
Remarque :
• Pour la méthode ensembliste on ne peu afficher
que les colonnes qui appartiennent à la table de la
requête extérieur alors que pour la prédicative on
peut afficher toutes les colonnes appartemant aux tables
de jointure
UNION,EXCEPT,INTERSECT
• EXCEPT et INTERSECT sont de nouveaux
opérateurs permettant de trouver des
enregistrements communs à deux jeux de
données ou de retrouver des enregistrements
figurant dans un jeu de données et pas dans
l’autre. Ces opérateurs obéissent aux mêmes
règles que UNION, les jeux d’enregistrement
doivent être de structure identique (même nombre
de colonnes, mêmes types voire même longueur).
Synthèse
Ce chapitre vous à permis d'apprendre à :
• déterminer quand une sous-interrogation peut
aider à résoudre un problème
• écrire des sous-interrogations lorsqu'une
interrogation est basée sur des valeurs inconnues
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
Présentation de l'exercice 6
Dans cet exercice, vous allez :
• créer des sous-interrogations pour interroger des
valeurs basées sur un critère inconnu,
• utiliser des sous-interrogations pour déterminer
quelles valeurs existent dans un ensemble de
données et pas dans un autre.