Avancé · 20 min
Opérations ensemblistes : combiner plusieurs requêtes
UNION, UNION ALL, INTERSECT et EXCEPT pour combiner le résultat de requêtes ayant les mêmes colonnes.
Contexte
Parfois la réponse à une question ne tient pas dans UNE requête avec des JOIN et des WHERE : on veut combiner, croiser ou soustraire le résultat de plusieurs requêtes distinctes qui renvoient les mêmes colonnes.
Explication
Quatre opérateurs, tous exigeant le même nombre de colonnes (de types compatibles) des deux côtés :
UNION: réunion des deux résultats, doublons supprimés.UNION ALL: réunion, doublons conservés (plus rapide, à préférer si on sait qu'il n'y a pas de doublon à gérer).INTERSECT: seulement les lignes présentes dans les DEUX résultats.EXCEPT: les lignes du premier résultat absentes du second.
SELECT col FROM a WHERE ...
UNION
SELECT col FROM b WHERE ...;
Piège fréquent : utiliser UNION ALL par réflexe alors qu'on veut UNION (des doublons apparaissent), ou l'inverse (UNION recalcule une déduplication inutile et coûteuse sur un gros volume sans doublons possibles).
Exemple guidé
Combiner deux catalogues de catégories (base boutique) sans doublon :
SELECT nom FROM produits WHERE categorie_id = 3
UNION
SELECT nom FROM produits WHERE categorie_id = 4
ORDER BY nom;
Pour une question plus fine — quels produits se sont vendus deux années de suite — INTERSECT compare directement deux listes d'identifiants (ventes 2024, ventes 2025) sans écrire de sous-requête corrélée.
À retenir
UNION déduplique, UNION ALL non. INTERSECT = présent des deux côtés. EXCEPT = présent à gauche, absent à droite. Toujours le même nombre de colonnes de types compatibles des deux côtés.