Chapitre
8 : Les sous‐requêtes
Chapitre 8 :
Les sous‐requêtes
1.1 NOTES DE COURS
1.1.1 DEFINITION D’UNE SOUS‐REQUETE
Une sous-requête est une requête imbriquée dans une instruction SELECT, INSERT,
UPDATE ou DELETE ou à l'intérieur d'une autre sous-requête. Une sous-requête peut
renvoyer un ensemble de lignes ou simplement une ligne. Une sous-requête scalaire est une
requête qui renvoie exactement une valeur : une seule ligne, avec une seule colonne. On peut
utiliser une sous-requête dans les clauses suivantes :
- SELECT : utilisée pour la projection de colonnes.
- FROM.
- WHERE.
- HAVING.
1.1.2 POURQUOI UTILISER LES SOUS-REQUETES ?
Il y a plusieurs situations où on aura besoin d’utiliser le résultat d'une requête dans une autre.
Exemple
Quels sont les noms des employés qui ont un salaire inférieur au salaire moyen ?
Cela peut être répondu par deux instructions, ou par une seule instruction avec une sous-
requête.
L'exemple suivant utilise deux instructions :
SELECT avg(salary) FROM employees
SELECT last_name FROM employees
WHERE salary < résultat de la requête précédente>
Comme on peut utiliser une seule instruction avec une sous-requête :
SELECT last_name
FROM employees
WHERE salary < (select avg(salary)from employees)
La syntaxe générale d’une sous-requête est :
SELECT liste_select
FROM table
WHERE expr operateur (SELECT liste_select FROM table)
- Mettre les sous-requêtes entre parenthèses.
- Placez les sous-requêtes sur le côté droit de la condition de comparaison pour la lisibilité.
1.1.3 TYPES DE SOUS-REQUETES
Il existe trois grands types de sous-requêtes :
- Sous-requêtes monolignes.
SQL : Les Requêtes Imbriquées, PR. Chiheb CHAIEB Page 1
Chapitre 8 : Les sous‐requêtes
- Sous-requêtes multilignes
- Sous-requêtes corrélées.
SOUS-REQUETES MONOLIGNE
- Retournent une seule ligne
- Utilisent des opérateurs de comparaison mono-ligne : =, <, >, <=, >=, <>.
- La sous-requête (requête interne) s'exécute (une seule fois) avant la requête principale
(requête externe).
- Le résultat de la sous-requête est utilisé par la requête principale.
Exemple :
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (SELECT min(salary) FROM employees)
SOUS-REQUETES MULTILIGNES
- Retournent plusieurs lignes.
- Utilisent des opérateurs de comparaison à multilignes : in , not in, !=all , =any etc.
- La sous-requête (requête interne) s'exécute (une seule fois) avant la requête principale
(requête externe).
- Le résultat de la sous-requête est utilisé par la requête principale.
Exemple
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY (SELECT salary FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG’
SOUS-REQUETES CORRELEES
Une sous-requête corrélée fait référence à des colonnes dans la requête principale, donc son
résultat dépend de la requête principale. Cela rend impossible l'évaluation de la sous-requête
avant d'évaluer la requête principale.
Exemple :
Considérez une requête qui affiche tous les employés dont le salaire est inférieur au salaire
moyen de leur département. Dans ce cas, la sous-requête doit être exécutée pour chaque
employé afin de déterminer le salaire moyen de son département Il est nécessaire de passer le
numéro de département de l'employé à la sous-requête.
SELECT p.last_name, p.department_id
FROM employees p
WHERE p.salary < (SELECT avg(s.salary) FROM employees s
WHERE s.department_id=p.department_id)
SQL : Les Requêtes Imbriquées, PR. Chiheb CHAIEB Page 2
Chapitre 8 : Les sous‐requêtes
ACTIVITES
Dans chaque cas, on demande d’écrire une requête SQL pour l’opération considérée :
a) Afficher les employés ayant le salaire minimal.
b) Afficher les noms de tous les directeurs. (18 lignes)
c) Quels sont les employés qui ont un salaire inférieur au salaire moyen de tous les
employés.(56 lignes)
d) Quels sont les employés qui ont un salaire inférieur au salaire moyen des employés de
leurs départements. (65 lignes)
e) Donner le salaire maximum dans chaque pays.
f) Quels sont les départements qui ont le nombre maximum d’employés ?
SQL : Les Requêtes Imbriquées, PR. Chiheb CHAIEB Page 3