Une sous-requête est une requête imbriquée dans une autre requête — utilisée dans WHERE, FROM, SELECT, ou avec EXISTS. Elle vous permet d'utiliser le résultat d'une requête dans une autre, permettant des filtres complexes et des calculs.
Une sous-requête est une requête imbriquée dans une autre requête — utilisée dans WHERE, FROM, SELECT, ou avec EXISTS. Elle vous permet d'utiliser le résultat d'une requête dans une autre, permettant des filtres complexes et des calculs.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
Une sous-requête dans WHERE fournit des valeurs à filtrer — une liste (avec IN) ou une valeur unique (avec des opérateurs de comparaison).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
Une sous-requête corrélée référence la requête externe — elle s'exécute une fois par ligne externe (potentiellement plus lente). Une sous-requête non corrélée s'exécute une seule fois.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS vérifie si une sous-requête retourne des lignes — souvent plus efficace que IN pour les vérifications d'existence (elle peut s'arrêter à la première correspondance).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
Les sous-requêtes sont une technique SQL importante pour les requêtes complexes — utiliser le résultat d'une requête dans une autre permet des filtres et des calculs que les requêtes simples ne peuvent pas exprimer, donc les comprendre est précieux pour écrire des requêtes du monde réel.
Connaître les formes — les sous-requêtes dans WHERE (filtrage par une liste avec IN ou une valeur unique avec des comparaisons), les sous-requêtes corrélées (référençant la requête externe, s'exécutant par ligne), EXISTS (vérifications d'existence efficaces), et les sous-requêtes dans FROM (tables dérivées) — couvre les modèles communs pour exprimer une logique complexe.
Comprendre la distinction entre les sous-requêtes corrélées et non corrélées est important pour la performance (les sous-requêtes corrélées s'exécutent une fois par ligne externe et peuvent être lentes).
Également précieux est de connaître la relation aux JOINs et CTEs : de nombreuses sous-requêtes peuvent être réécrites en JOINs (souvent plus efficaces et lisibles) ou en CTEs (plus nettes pour les cas complexes), donc comprendre quand utiliser chacun — sous-requêtes pour la clarté du filtrage/agrégation, JOINs pour combiner des données — est une compétence pratique.
Puisque les requêtes du monde réel nécessitent souvent l'imbrication (filtrage par des résultats agrégés, vérifications d'existence, comparaison à des valeurs calculées), et puisque la compréhension des sous-requêtes, de leurs caractéristiques de performance (surtout les corrélées), et de leur relation aux JOINs/CTEs est importante pour écrire des requêtes complexes efficaces, maîtriser les sous-requêtes est une connaissance précieuse et fréquemment appliquée pour SQL au-delà des requêtes basiques et un sujet d'entretien courant qui démontre la capacité à exprimer des besoins de données complexes.