Dans les modules précédents, nous avons appris à récupérer des données et à les joindre. Mais parfois, une seule requête ne suffit pas pour obtenir la réponse. Il faut d'abord trouver une valeur (comme une moyenne ou un ID spécifique), puis l'utiliser dans une autre requête. C'est là qu'interviennent les sous-requêtes.
Une sous-requête (ou requête interne) est une instruction SELECT imbriquée dans une autre instruction SQL. La requête qui contient la sous-requête est appelée requête externe (ou principale).
Les sous-requêtes sont toujours entourées de parenthèses ().
En général, la base exécute d'abord la requête interne. Le résultat est ensuite transmis à la requête externe, qui l'utilise pour compléter son exécution.
-- Exemple conceptuel
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
^------- Ceci s'exécute en premier -------^
Les sous-requêtes sont classées selon le type de données retournées :
FROM comme une table temporaire.L'usage le plus courant est dans la clause WHERE pour filtrer selon une valeur dynamique.
Scénario : Trouver les films dont le coût de remplacement est supérieur à la moyenne de tous les films.
SELECT
title,
replacement_cost
FROM
film
WHERE
replacement_cost > (SELECT AVG(replacement_cost) FROM film);
Quand une sous-requête est placée dans la clause FROM, on parle de vue en ligne. On crée ainsi une table temporaire "à la volée" qui n'existe que pour la durée de la requête.
Note : Il faut obligatoirement donner un alias à la vue en ligne.
Scénario : Obtenir la liste des clients actifs et la joindre à leurs paiements.
-- Exemple de vue en ligne
SELECT c.first_name, c.last_name, p.amount
FROM (
SELECT customer_id, first_name, last_name
FROM customer
WHERE active = 1
) AS c
INNER JOIN payment AS p ON c.customer_id = p.customer_id;
Points clés de cette leçon :
WHERE pour filtrer dynamiquement, ou dans FROM pour créer des vues temporaires.Dans la prochaine leçon, nous approfondirons les sous-requêtes multi-lignes et verrons comment les utiliser avec IN, ANY, ALL et d'autres opérateurs.