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
WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.fk = t1.id)WHERE col IN (SELECT col FROM t2)Exemple
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
- 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.
- Contrairement à un JOIN, EXISTS ne multiplie pas les lignes : un client avec trois commandes livrées n'apparaît qu'une fois, sans DISTINCT.
- 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).
- 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
- Sous-requêtesUne sous-requête est un SELECT placé à l'intérieur d'une autre requête, dans WHERE, FROM ou SELECT. Elle calcule une valeur intermédiaire, comme une moyenne, à laquelle on compare chaque ligne.
- Piège NOT IN et NULLNOT IN renvoie zéro ligne dès que sa sous-requête contient un NULL, sans aucun message d'erreur. Pour chercher des éléments absents d'une autre table, NOT EXISTS donne toujours le bon résultat.
- IN, BETWEEN, LIKEIN teste l'appartenance à une liste, BETWEEN un intervalle bornes comprises, LIKE un motif de texte avec jokers. Ces trois opérateurs raccourcissent les conditions répétitives de WHERE.
- INNER JOININNER JOIN associe les lignes de deux tables qui se correspondent, en général une clé étrangère et la clé primaire qu'elle référence. Les lignes sans correspondance disparaissent du résultat.