Anatomie d’une sous-requête corrélée
Comprendre comment la requête interne référence la ligne externe et fonctionne ligne par ligne
Anatomie d’une sous-requête corrélée est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.
Qu'est-ce qui rend une sous-requête corrélée
Les intervieweurs distinguent deux catégories de sous-requêtes. Une sous-requête simple (non corrélée) peut s'exécuter seule. Une sous-requête corrélée fait référence à une colonne de la requête externe et ne peut donc pas s'exécuter de manière autonome.
- Non corrélée : évaluée une fois, son résultat est réutilisé pour chaque ligne externe.
- Corrélée : réévaluée une fois par ligne externe, car elle dépend de cette ligne.
Le signe révélateur est la présence d'une colonne de la table externe à l'intérieur de la requête interne. Repérez-la et vous pourrez nommer instantanément ce schéma.
Modèle d’exécution pour chaque ligne
Imaginez le moteur parcourant les lignes externes. Pour chaque ligne externe, il injecte les valeurs de cette ligne dans la requête interne, l’exécute, puis utilise le résultat pour décider de quelque chose ou effectuer un calcul.
C’est le modèle mental que les personnes qui mènent l’entretien veulent vous voir formuler : « la requête interne s’exécute une fois pour chaque ligne externe. »
Cette formulation laisse aussi entrevoir la question classique qui suit : les sous-requêtes corrélées peuvent être lentes, car la requête interne peut s’exécuter des milliers de fois. Nous corrigerons cela dans la leçon 4.
Repérer la référence externe
Ici, les employés et un alias externe pour les employés rémunérés au salaire pilotent une requête interne qui lit e1.dept_id. Cette référence à la ligne externe constitue la corrélation.
Supprimez le préfixe de l’alias et la requête interne ne se compile plus de manière autonome. Cette dépendance est précisément ce qui la rend corrélée.
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Lire cette requête à voix haute
Traduisez la requête précédente en français courant, comme vous le feriez en entretien :
« Pour chaque employé e1, trouvez le salaire moyen de son propre département et ne gardez l’employé que s’il gagne plus que cette moyenne départementale. »
Le WHERE e2.dept_id = e1.dept_id de la requête interne relie la moyenne au département de cet employé. Sans cette ligne, vous compareriez tout le monde à la moyenne de l’entreprise.
Les alias sont obligatoires
Lorsque les requêtes interne et externe portent sur la même table, vous devez donner un alias aux deux afin que le moteur sache à quelle ligne appartient une colonne.
e1= la ligne externe examinée.e2= le parcours interne de la table.
Supprimez les alias et dept_id devient ambigu ; de nombreux moteurs l’associeront alors silencieusement à la table interne, ce qui casse la corrélation. Les personnes qui mènent l’entretien introduisent précisément cette erreur.
Sous-requête corrélée dans SELECT
Les sous-requêtes corrélées ne se limitent pas à WHERE. Dans une liste SELECT, elles produisent une colonne calculée, évaluée là encore pour chaque ligne externe.
Ci-dessous, chaque commande indique combien d’autres commandes le même client a passées. Le décompte interne est corrélé via o.customer_id.
SELECT o.order_id,
o.customer_id,
(SELECT COUNT(*)
FROM orders o2
WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;Scalaire signifie exactement une valeur
Une sous-requête corrélée utilisée dans SELECT ou comparée avec =, >, < doit renvoyer une valeur scalaire unique pour chaque ligne externe.
Si elle renvoie plusieurs lignes, la base de données génère une erreur telle que « la sous-requête renvoie plus d’une ligne. »
Les agrégats comme COUNT, MAX ou AVG garantissent une seule valeur, c’est pourquoi ils sont courants dans les sous-requêtes corrélées scalaires. Connaître cette règle évite une surprise fréquente à l’exécution.
Lorsque la sous-requête renvoie NULL
Une sous-requête corrélée scalaire peut ne trouver aucune ligne interne. Un agrégat renvoie alors NULL (ou, pour COUNT, 0).
Ce NULL se propage dans votre expression externe. Les comparaisons avec NULL donnent UNKNOWN ; la ligne externe peut donc être exclue silencieusement.
Si vous avez besoin d’une valeur de repli, encapsulez la sous-requête dans COALESCE. Les personnes qui mènent l’entretien aiment demander ce qui se passe lorsqu’aucune ligne interne ne correspond, en attendant que vous mentionniez le comportement de NULL.
SELECT c.customer_id,
COALESCE((SELECT MAX(o.amount)
FROM orders o
WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;Exemple détaillé : date de la dernière commande
Une tâche courante consiste à afficher chaque client avec la date de sa commande la plus récente. Une sous-requête corrélée dans SELECT permet de le faire directement.
Pour chaque ligne de client, la requête interne trouve la date de commande maximale pour ce client grâce à o.customer_id = c.customer_id.
SELECT c.customer_id,
c.name,
(SELECT MAX(o.order_date)
FROM orders o
WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;Pourquoi cela peut être lent
Comme la requête interne s’exécute une fois par ligne externe, une sous-requête corrélée portant sur une grande table externe peut déclencher des millions d’exécutions internes.
- Un index sur la colonne corrélée — ici
orders.customer_id— permet à chaque exécution interne de se terminer rapidement. - Sans index, chaque exécution peut parcourir toute la table, pour un travail d’environ O(n*m).
En entretien, mentionnez toujours l’index et la réécriture en jointure comme leviers de performance.
Corrélée et non corrélée côte à côte
La différence tient à une seule ligne. La version non corrélée compare tout le monde à la moyenne de l’entreprise ; la version corrélée compare chaque personne à son propre département.
Lisez les deux versions et remarquez comment l’unique ligne WHERE e2.dept_id = e1.dept_id modifie tout le sens.
-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary) FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Vérification rapide
Vérifiez votre compréhension de ce qui définit une sous-requête corrélée.
Récapitulatif : anatomie d’une sous-requête corrélée
Points essentiels :
- Une sous-requête corrélée fait référence à la ligne externe et s’exécute une fois par ligne externe.
- Donnez un alias aux deux tables lorsqu’il s’agit de la même table afin de garder la corrélation sans ambiguïté.
- Une utilisation scalaire doit renvoyer exactement une valeur ; une absence de correspondance produit NULL, utilisez donc
COALESCEpour vous en prémunir. - Elle peut figurer dans SELECT ou WHERE, et les performances dépendent de l’indexation de la colonne corrélée.
Dites « s’exécute une fois par ligne externe » en entretien et vous aurez parfaitement compris le concept essentiel.
Questions Fréquemment Posées
La leçon « Anatomie d’une sous-requête corrélée » est-elle gratuite ?
Oui — le texte complet de « Anatomie d’une sous-requête corrélée » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Anatomie d’une sous-requête corrélée » ?
Comprendre comment la requête interne référence la ligne externe et fonctionne ligne par ligne Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?
Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Anatomie d’une sous-requête corrélée » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?
Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Anatomie d’une sous-requête corrélée
- Agrégats par groupe sans GROUP BY
- EXISTS et NOT EXISTS corrélés
- Réécrire les sous-requêtes corrélées avec des jointures