Maintenant t'es prêt pour l'étape suivante — bosser avec les requêtes imbriquées en SQL. Aujourd'hui, on va voir ce que c'est, pourquoi c'est utile, quels types de requêtes imbriquées existent et pourquoi c'est vraiment pratique dans la vraie vie.
Les requêtes imbriquées (ou sous-requêtes) — ce sont des requêtes SQL qu'on utilise à l'intérieur d'autres requêtes SQL. Genre une poupée russe ou un oignon : t'as une requête principale, et dedans y'en a une autre, plus petite, cachée. La sous-requête s'exécute en premier, et son résultat est utilisé par la requête principale (parfois on l'appelle "requête principale").
Voyons ça avec un exemple :
Exemple 1 : Comment ça marche
On a une table students avec les données suivantes :
| id | nom | âge | groupe_id |
|---|---|---|---|
| 1 | Alisa | 20 | 1 |
| 2 | Bob | 22 | 2 |
| 3 | Klark | 21 | 1 |
| 4 | Dina | 23 | 3 |
| 5 | Emilia | 22 | 2 |
Et aussi une table groups, où on stocke les infos sur les noms des groupes :
| id | nom_du_groupe |
|---|---|
| 1 | Classe mathématique |
| 2 | Classe physique |
| 3 | Classe littéraire |
Si on veut savoir les noms des groupes où étudient les étudiants, on peut utiliser une requête imbriquée :
SELECT nom_du_groupe
FROM groups
WHERE id IN (
SELECT groupe_id
FROM students
WHERE âge > 21
);
Qu'est-ce qui se passe ici ?
La sous-requête :
SELECT groupe_id
FROM students
WHERE âge > 21
Cette requête sélectionne groupe_id de tous les étudiants de plus de 21 ans. Résultat : une liste d'identifiants de groupes, par exemple [2, 3].
La requête principale :
SELECT nom_du_groupe
FROM groups
WHERE id IN ([résultats de la sous-requête])
Cette requête utilise les résultats de la sous-requête et renvoie les noms des groupes avec id égal à 2 ou 3.
Résultat :
Classe physique
Classe littéraire
Tu piges toujours rien ? C'est normal. Mais t'inquiète, on va tout décortiquer maintenant.
On commence avec une idée simple — le résultat d'une requête SELECT — c'est une sorte de table virtuelle. Franchement, elle a des colonnes, elle a des lignes. Pourquoi pas une table ?
Et si le résultat d'une requête est une table, tu peux l'utiliser là où tu utilises des vraies tables : dans un JOIN par exemple, ou dans des constructions plus complexes.
Elle n'a pas de nom, et c'est un souci. Mais les colonnes-expressions n'ont pas de noms non plus, et on règle ça en leur donnant un alias — un pseudo. Tu peux faire pareil avec les tables virtuelles.
On verra ça plus en détail dans les prochaines leçons — pas de spoil ici :P
Pourquoi les requêtes imbriquées sont utiles
Elles simplifient les tâches compliquées. Parfois, une seule table n'a pas toutes les infos dont t'as besoin. Les sous-requêtes te permettent de diviser la requête en deux étapes : d'abord tu trouves un résultat intermédiaire, puis tu l'utilises pour choper les données finales.
Travailler avec des résultats intermédiaires. Les requêtes imbriquées sont utiles quand tu dois faire des calculs en plus avant de traiter les données. Genre trouver la valeur minimale ou calculer une somme.
Améliorer la lisibilité du code. Les requêtes imbriquées rendent le code plus structuré, surtout si tu bosses avec de grosses tables et une logique compliquée.
Les principaux types de requêtes imbriquées
Tu peux utiliser les requêtes imbriquées à différents endroits dans une requête SQL. Selon où tu les mets, il y a plusieurs types.
- Sous-requêtes dans
SELECT. La sous-requête est dans la liste des colonnes et sert à calculer des valeurs. C'est pratique, par exemple, pour ajouter une nouvelle colonne dans les résultats.
Exemple — on ajoute une colonne avec l'âge max parmi les étudiants :
SELECT nom, âge,
(SELECT MAX(âge) FROM students) AS âge_max
FROM students;
Résultat :
| nom | âge | âge_max |
|---|---|---|
| Alisa | 20 | 23 |
| Bob | 22 | 23 |
| Klark | 21 | 23 |
| Dina | 23 | 23 |
| Emilia | 22 | 23 |
- Sous-requêtes dans
FROM. La sous-requête est utilisée comme une table temporaire. C'est utile si tu dois d'abord agréger ou transformer les données.
Exemple — calculer l'âge moyen des étudiants dans chaque groupe :
SELECT tmp.groupe_id, tmp.âge_moyen
FROM (
SELECT groupe_id, AVG(âge) AS âge_moyen
FROM students
GROUP BY groupe_id
) AS tmp -- On donne le pseudo tmp à la table temporaire
WHERE tmp.âge_moyen > 21;
Résultat :
| groupe_id | âge_moyen |
|---|---|
| 2 | 22.0 |
| 3 | 23.0 |
- Sous-requêtes dans
WHEREetHAVING. Les sous-requêtes peuvent servir de condition pour filtrer les lignes. C'est souvent utilisé pour vérifier - l'existence d'enregistrements ou pour comparer des valeurs.
Exemple — les étudiants qui sont plus âgés que la moyenne :
SELECT nom, âge
FROM students
WHERE âge > (
SELECT AVG(âge)
FROM students
);
Résultat :
| nom | âge |
|---|---|
| Bob | 22 |
| Dina | 23 |
| Emilia | 22 |
Les avantages d'utiliser les requêtes imbriquées
Plus de flexibilité : les requêtes imbriquées te permettent de bosser avec des structures de données plus complexes.
Découper les tâches en étapes : tu peux séparer la logique en sous-requêtes, ce qui rend le code plus lisible.
Accès aux données intermédiaires : tu peux traiter les données "à la volée", sans avoir besoin de créer des tables temporaires dans la base de données.
GO TO FULL VERSION