L'opérateur UNION en SQL
La clause/opérateur SQL UNION est utilisée pour combiner les résultats de deux ou plusieurs instructions SELECT sans renvoyer les lignes en double.
Pour utiliser cette clause UNION, chaque instruction SELECT doit avoir :
- Le même nombre de colonnes sélectionnées
- Le même type de données pour les colonnes correspondantes
- Les colonnes dans le même ordre
Mais elles n'ont pas besoin d'avoir la même longueur.
La clause UNION produit des valeurs distinctes dans le jeu de résultats (élimine les doublons).
Pour conserver les valeurs en double, UNION ALL doit être utilisé à la place de UNION.
Syntaxe
Syntaxe - UNION (sans doublons)
SELECT colonne1 [, colonne2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT colonne1 [, colonne2 ]
FROM table1 [, table2 ]
[WHERE condition]Syntaxe - UNION ALL (avec doublons)
SELECT colonne1 [, colonne2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT colonne1 [, colonne2 ]
FROM table1 [, table2 ]
[WHERE condition]Ici, la condition donnée peut être toute expression en fonction de vos besoins.
Les noms de colonne dans les deux instructions SELECT peuvent être différents mais le type de données doit être identique. Dans le résultat, le nom de la colonne utilisée dans la première instruction SELECT apparaîtra.
Tables d'exemple
Pendant ce cours, nous allons travailler sur ces 2 tables :
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Technicien | 2 |
| 2 | Mohamed | 30 | 2000.10 | Directeur | 1 |
| 3 | Fatima | 29 | 8000.00 | Assistant | 2 |
| 4 | Dounia | 30 | 1750.00 | Assistant | 4 |
| 5 | Omar | 30 | 2250.00 | Ingenieur | 1 |
| 6 | Mostafa | 32 | 7500.00 | Formateur | 1 |
+----+---------+-----+---------+------------+------+Table - Conges
+------+------------+------------+-------------------+-----+
| Id_c | Date_debut | Date_fin | Raison | Emp |
+------+------------+------------+-------------------+-----+
| 1 | 2019-02-01 | 2019-02-15 | Voyage | 1 |
| 2 | 2019-05-20 | 2019-06-03 | Maladie d'enfant | 3 |
| 3 | 2019-09-01 | 2019-09-15 | Rentrée scolaire | 4 |
+------+------------+------------+-------------------+-----+Exemples d'utilisation
UNION simple
Pour récupérer des identifiants distincts d'employés à partir des tables Employes et Conges.
SELECT Id FROM Employes
UNION
SELECT Emp FROM Conges;+----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +----+
Explication :
- La première requête sélectionne tous les Id de la table Employes (1,2,3,4,5,6).
- La deuxième requête sélectionne tous les Emp de la table Conges (1,3,4).
- UNION élimine les doublons : les valeurs 1,3,4 apparaissent une seule fois.
- Résultat final : 1,2,3,4,5,6 (tous les Id distincts des deux tables).
UNION ALL avec doublons
Pour récupérer des identifiants d'employés de la table Employes et de la table Conges, y compris les valeurs en double.
SELECT Id FROM Employes
UNION ALL
SELECT Emp FROM Conges;+----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 1 | | 3 | | 4 | +----+
Explication :
- Contrairement à UNION, UNION ALL conserve tous les résultats, y compris les doublons.
- Les valeurs 1,3,4 apparaissent deux fois (une fois de chaque table).
- Le résultat contient 9 lignes au total.
UNION ALL avec conditions et tri
Pour récupérer Id et Nom de la table Employes où Id est supérieur à 3, et Emp, Raison de la table Conges où Emp est inférieur à 3, en incluant les valeurs en double et en triant les données par Id.
SELECT Id, Nom FROM Employes WHERE Id > 3
UNION ALL
SELECT Emp, Raison FROM Conges WHERE Emp < 3
ORDER BY Id;+----+---------+ | Id | Nom | +----+---------+ | 1 | Voyage | | 4 | Dounia | | 5 | Omar | | 6 | Mostafa | +----+---------+
Explication :
- Première requête : Id > 3 dans Employes → (4, Dounia), (5, Omar), (6, Mostafa).
- Deuxième requête : Emp < 3 dans Conges → (1, Voyage), (3, Maladie d'enfant) n'est pas inclus car Emp=3 n'est pas < 3.
- UNION ALL combine les résultats (4 lignes).
- ORDER BY Id trie le résultat final par la colonne Id.
- Note : La colonne "Nom" dans le résultat prend le nom de la première requête, mais contient des valeurs de nature différente (noms d'employés et raisons de congés).
UNION avec LEFT JOIN et RIGHT JOIN
Utiliser LEFT JOIN et RIGHT JOIN dans la clause UNION.
SELECT E.Id, E.Nom FROM Employes as E LEFT JOIN Conges as C ON E.Id = C.Emp
UNION
SELECT E.Id, E.Nom FROM Employes as E RIGHT JOIN Conges as C ON E.Id = C.Emp;+------+---------+ | Id | Nom | +------+---------+ | 1 | Ismail | | 3 | Fatima | | 4 | Dounia | | 2 | Mohamed | | 5 | Omar | | 6 | Mostafa | +------+---------+
Explication :
- LEFT JOIN : tous les employés, même ceux sans congés (tous les Id de 1 à 6).
- RIGHT JOIN : tous les employés qui ont des congés (ceux dont Id = Emp dans Conges : 1,3,4).
- UNION (sans ALL) combine les deux résultats et élimine les doublons.
- Le résultat final contient tous les employés (1 à 6) une seule fois.
- Cette requête équivaut à un FULL OUTER JOIN simulé avec UNION.
Récapitulatif
| Opérateur | Comportement | Quand l'utiliser |
|---|---|---|
| UNION | Combine les résultats et élimine les doublons | Quand on veut des valeurs distinctes |
| UNION ALL | Combine les résultats en conservant tous les doublons | Quand on veut toutes les valeurs (plus rapide car pas de tri pour éliminer les doublons) |
- Utilisez UNION ALL plutôt que UNION lorsque vous savez qu'il n'y a pas de doublons ou que vous voulez les conserver (plus performant).
- Les colonnes doivent correspondre en nombre, type et ordre.
- ORDER BY s'applique au résultat final, pas aux requêtes individuelles.
- Les noms des colonnes dans le résultat sont ceux de la première requête.
Requêtes avec UNION
En utilisant les tables Employes et Conges, écrivez les requêtes SQL pour :
- Afficher tous les noms des employés et toutes les raisons de congés (une seule liste, sans doublons).
- Afficher tous les identifiants des employés du département 1 et tous les identifiants des employés ayant pris un congé (avec doublons).
- Combiner les noms et professions des employés avec les raisons de congés, triés par ordre alphabétique.
- Noms et raisons (sans doublons) :
SELECT Nom FROM Employes UNION SELECT Raison FROM Conges;Résultat : Ismail, Mohamed, Fatima, Dounia, Omar, Mostafa, Voyage, Maladie d'enfant, Rentrée scolaire
- Identifiants du département 1 et identifiants avec congés (avec doublons) :
SELECT Id FROM Employes WHERE Dep = 1 UNION ALL SELECT Emp FROM Conges;Résultat : 2,5,6,1,3,4 (les Id 2,5,6 du département 1, puis tous les Emp des congés)
- Noms/professions et raisons triés :
SELECT Nom AS "Valeur" FROM Employes UNION SELECT Profession FROM Employes UNION SELECT Raison FROM Conges ORDER BY Valeur;Résultat : liste triée de tous les noms, professions et raisons.
- UNION combine les résultats de plusieurs SELECT en éliminant les doublons.
- UNION ALL combine les résultats en conservant tous les doublons (plus rapide).
- Les requêtes combinées doivent avoir le même nombre de colonnes, les mêmes types et dans le même ordre.
- Les noms des colonnes du résultat sont ceux de la première requête.
- ORDER BY s'applique au résultat final, pas aux requêtes individuelles.
- On peut utiliser UNION pour simuler un FULL OUTER JOIN en combinant LEFT JOIN et RIGHT JOIN.
- UNION est utile pour fusionner des données de tables différentes ou pour créer des listes combinées.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.