Les opérateurs ensemblistes (UNION, UNION ALL, INTERSECT, MINUS) permettent de combiner les résultats de plusieurs requêtes SELECT en Oracle SQL. C'est un incontournable des entretiens et des exercices SQL : voici la syntaxe, les différences et les pièges classiques.
🧪 Testez ce code vous-même : exécutez ces requêtes gratuitement dans notre SQL Playground en ligne — sans installation, directement dans le navigateur.
UNION : combiner sans doublons
UNION fusionne les lignes de deux requêtes et élimine les doublons (avec un tri implicite, donc un coût).
SELECT nom, ville FROM clients
UNION
SELECT nom, ville FROM prospects;UNION ALL : plus rapide, avec doublons
UNION ALL concatène tout, sans dédoublonnage. Préférez UNION ALL quand les doublons sont impossibles ou acceptables : c'est nettement plus performant.
SELECT nom FROM clients
UNION ALL
SELECT nom FROM prospects;INTERSECT : les lignes communes
INTERSECT ne renvoie que les lignes présentes dans les deux résultats.
SELECT email FROM newsletter
INTERSECT
SELECT email FROM clients; -- abonnés qui sont aussi clientsMINUS : la différence
MINUS (équivalent de EXCEPT dans d'autres SGBD) renvoie les lignes de la première requête qui n'existent pas dans la seconde.
SELECT email FROM newsletter
MINUS
SELECT email FROM clients; -- abonnés pas encore clientsLes 3 règles à respecter
- Même nombre de colonnes dans chaque SELECT ;
- Types de données compatibles colonne par colonne ;
- Un seul
ORDER BY, placé à la toute fin de la requête complète.
SELECT nom, ville FROM clients
UNION ALL
SELECT nom, ville FROM prospects
ORDER BY nom; -- ORDER BY unique, en dernierUNION vs JOIN : ne pas confondre
Un JOIN combine des colonnes de tables liées (horizontalement), un UNION empile des lignes de même structure (verticalement).
Questions fréquentes
Quelle est la différence entre UNION et UNION ALL ?
UNION élimine les doublons (avec un tri implicite coûteux), UNION ALL garde toutes les lignes et est plus rapide. Utilisez UNION ALL par défaut si les doublons ne posent pas de problème.
MINUS existe-t-il dans tous les SGBD ?
Non. MINUS est propre à Oracle. SQL Server et PostgreSQL utilisent EXCEPT, qui fait exactement la même chose. Depuis Oracle 21c, EXCEPT est aussi accepté.
Peut-on utiliser ORDER BY dans chaque SELECT d’un UNION ?
Non, Oracle lève l’erreur ORA-00933. Un seul ORDER BY est autorisé, placé après le dernier SELECT, et il s’applique au résultat combiné.
