</>
Plan du cours — 9/64

Sous-requêtes et EXISTS

Intermédiaire

Une 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 ?#

  • EXISTS s'arrête à la première ligne trouvée et gère correctement les NULL.
  • NOT IN échoue silencieusement si la sous-requête renvoie un NULL (aucune ligne retournée).
  • Le planificateur réécrit souvent IN en 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.