INTERSECT & EXCEPT
INTERSECT garde les lignes présentes dans les deux requêtes, EXCEPT celles de la première absentes de la seconde. Idéal pour répondre à « qui est dans cette liste mais pas dans l'autre ? ».
- intersection
- différence
- ensemble
- MINUS
Syntaxe
SELECT col FROM a INTERSECT SELECT col FROM b; -- présents dans les deuxSELECT col FROM a EXCEPT SELECT col FROM b; -- dans a mais pas dans bExemple
SELECT id FROM customersEXCEPTSELECT customer_id FROM orders;-- Jeu de données : boutique-- Clients qui n'ont jamais commandé (5 = Nora Petit).-- Variante : SELECT id FROM customers WHERE city = 'Paris'-- INTERSECT SELECT customer_id FROM orders donne 1 et 3.-- Résultat attendu :-- 5À retenir
- INTERSECT et EXCEPT existent dans SQLite depuis toujours, ainsi que dans PostgreSQL et SQL Server. Oracle écrit MINUS au lieu d'EXCEPT (Oracle 21c accepte aussi EXCEPT).
- Comme UNION, ils dédoublonnent le résultat. PostgreSQL propose INTERSECT ALL et EXCEPT ALL pour garder les doublons, SQLite non.
- Piège : les colonnes sont comparées par position, pas par nom. SELECT id, name EXCEPT SELECT name, id ne compare pas ce que l'on croit.
- Contrairement à NOT IN, EXCEPT considère deux NULL comme égaux : c'est une alternative sûre pour chercher des absents.
Voir aussi
- UNION / UNION ALLUNION empile les lignes de deux requêtes compatibles en un seul résultat. UNION supprime les doublons, UNION ALL les garde et va plus vite. Utile pour fusionner des listes de même nature.
- 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.
- 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.