Leçons du module (4/4)
UNION, INTERSECT, EXCEPT (et CROSS JOIN)
Jusqu'à présent, vous avez combiné les données horizontalement : JOIN attache les colonnes
à partir des lignes associées. SQL propose également une autre famille d'opérateurs qui
combine les données verticalement, en traitant les résultats de deux SELECT comme
ensembles : UNION, INTERSECT, EXCEPT. Nous revisitons également CROSS JOIN, le
produit cartésien.
CROSS JOIN : chaque ligne avec chaque ligne
CROSS JOIN n'a pas de ON : il produit toutes les combinaisons possibles de
lignes entre deux tables (produit cartésien). Si A a n lignes et B
a m lignes, le résultat a n × m.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 clients × 16 produits = 192 lignes. Il est rarement utilisé sur des données réelles (c'est cher !), mais c'est utile pour :
- générer des combinaisons « tous contre tous » (par exemple une matrice de compatibilité) ;
- appairer un tableau avec un petit tableau de constantes/paramètres.
UNION et UNION TOUS
UNION ajoute les résultats de deux SELECT avec le même numéro et
type de colonnes :
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Règles:
- les deux
SELECTdoivent avoir le même nombre de colonnes, avec des espèces ; UNION(sansALL) supprime les doublons — exécutant efficacement unDISTINCTsur le résultat final ;UNION ALLconserve également les doublons et est beaucoup plus rapide car il évite le tri/hachage pour la déduplication.
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM customers c JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.email
FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT et SAUF
INTERSECT conserve uniquement les lignes présentes dans les deux résultats ; EXCEPT
conserve les lignes du premier qui ne sont pas dans le second (l'ensemble
"différence").
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;
-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT et EXCEPT suppriment également les doublons par défaut ; le
Les variantes INTERSECT ALL / EXCEPT ALL ne le font pas.
Essayez-le vous-même
Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Une colonne : e-mail. Ordina par email.
Afficher l'indice
UNION entre deux SELECT renvoyant la même colonne email. Le ORDER BY va à la fin, sur le résultat final.
Solution disponible après 3 tentatives
Exercice de révision
Trouvez l'e-mail des clients qui ont été ordonnés mais qui ne peuvent pas recevoir de réponse nulle. Etats-Unis SAUF. Une colonne : e-mail. Ordina par email.
Afficher l'indice
EXCEPT conserve uniquement les lignes du SELECT de gauche qui ne sont pas présentes dans celui de droite.
Solution disponible après 3 tentatives