Cours SQL et MySQL · Module 8: Sous-requêtes
Les sous-requêtes corrélées
Dans cette leçon3
Nous allons plus loin. Jusqu'ici, la sous-requête s'exécutait une seule fois et renvoyait un résultat tout prêt. Une sous-requête corrélée est différente : elle fait référence à une colonne de la requête externe et s'exécute à nouveau pour chaque ligne traitée à l'extérieur.
Une référence à la ligne externe
1SELECT a.imie, a.nazwisko
2FROM autorzy AS a
3WHERE 3 < (
4 SELECT COUNT(*)
5 FROM ksiazki AS k
6 WHERE k.autor_id = a.id
7);Remarque la condition k.autor_id = a.id. La sous-requête connaît a.id - la valeur de la ligne courante de la requête externe. Pour chaque auteur, la Bibliothèque compte ses livres et ne garde que ceux qui en ont plus de trois.
Comment cela fonctionne, étape par étape
- La requête externe prend le premier auteur.
- La sous-requête compte les livres de cet auteur.
- La condition vérifie le résultat - l'auteur reste ou est écarté.
- La Bibliothèque passe à l'auteur suivant et recommence tout depuis le début.
Simple ou corrélée ?
- Une sous-requête simple se suffit à elle-même - tu peux l'exécuter seule.
- Une sous-requête corrélée n'a aucun sens sans la requête externe - elle a besoin de la valeur
a.id.
Les sous-requêtes corrélées peuvent être plus lentes (elles s'exécutent plusieurs fois), mais elles sont remarquablement puissantes - elles te permettent de poser des questions comme « pour chaque ligne, vérifie quelque chose de l'autre côté ».
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. Qu'est-ce qui caractérise une sous-requête corrélée ?
2. En quoi une sous-requête corrélée diffère-t-elle d'une sous-requête simple ?
Tâches pratiques dans le jeu
- Tri vertical
Ordonne (de haut en bas) les étapes d'exécution d'une sous-requête corrélée pour chaque auteur :
- Éditeur de code
Écris une requête qui récupère dans la table autorzy (alias a) les colonnes imie et nazwisko des auteurs qui ont plus de 3 livres. Utilise une sous-requête corrélée COUNT(*) sur la table ksiazki (alias k), où la condition est k.autor_id = a.id.