Sous-requêtes et EXISTS
IntermédiaireUne sous-requête est une requête imbriquée : elle peut renvoyer une valeur, une liste ou servir de test d'existence.
-- Valeur unique : commandes au-dessus de la moyenne
SELECT id, total
FROM commandes
WHERE total > (SELECT avg(total) FROM commandes);
-- Test d'existence : clients qui ont au moins une commande > 500
SELECT c.nom
FROM clients c
WHERE EXISTS (
SELECT 1 FROM commandes o
WHERE o.client_id = c.id AND o.total > 500
);
-- Absence : clients sans commande
SELECT c.nom
FROM clients c
WHERE NOT EXISTS (SELECT 1 FROM commandes o WHERE o.client_id = c.id);
EXISTS ou IN ?#
EXISTSs'arrête à la première ligne trouvée et gère correctement lesNULL.NOT INéchoue silencieusement si la sous-requête renvoie unNULL(aucune ligne retournée).- Le planificateur réécrit souvent
INen semi-jointure : la différence de performance est faible, la différence de correction (NOT IN) est réelle.
Astuce : préférez
NOT EXISTSàNOT IN, presque toujours.