Aller au contenu
Filtrage avancé

EXISTS & IN (sous-requête)

EXISTS vérifie qu'une sous-requête renvoie au moins une ligne, IN qu'une valeur figure dans sa liste. Tous deux répondent à « a-t-il au moins un… ? » sans dupliquer les lignes comme le ferait un JOIN.

  • sous-requête
  • corrélation
  • semi-jointure
  • NOT EXISTS

Syntaxe

Modèle
WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.fk = t1.id)WHERE col IN (SELECT col FROM t2)

Exemple

Exemple concret
SELECT c.nameFROM customers cWHERE EXISTS (  SELECT 1  FROM orders o  WHERE o.customer_id = c.id    AND o.status = 'livré')ORDER BY c.name;-- Jeu de données : boutique-- Clients ayant au moins une commande livrée-- Résultat attendu :-- Emma Dubois-- Hugo Lambert-- Lucas Martin

À retenir

  1. La sous-requête d'EXISTS est corrélée : elle fait référence à c.id de la requête principale. Ce qu'elle sélectionne n'a pas d'importance, d'où le SELECT 1.
  2. Contrairement à un JOIN, EXISTS ne multiplie pas les lignes : un client avec trois commandes livrées n'apparaît qu'une fois, sans DISTINCT.
  3. Piège : NOT IN (SELECT …) renvoie zéro ligne dès que la sous-requête contient un seul NULL. Pour chercher des absents, utilisez NOT EXISTS (voir la fiche dédiée).
  4. Côté performances, les optimiseurs actuels traitent IN et EXISTS de façon très proche : choisissez la forme la plus lisible, et vérifiez avec EXPLAIN QUERY PLAN en cas de doute.

Voir aussi