Passer au contenu principal
eLearner.app
Module 5 · Leçon 4 sur 420/57 dans le cours~12 min
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.

SQL
-- 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 :

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

Règles:

  • les deux SELECT doivent avoir le même nombre de colonnes, avec des espèces ;
  • UNION (sans ALL) supprime les doublons — exécutant efficacement un DISTINCT sur le résultat final ;
  • UNION ALL conserve également les doublons et est beaucoup plus rapide car il évite le tri/hachage pour la déduplication.
SQL
-- 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").

SQL
-- 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

Exercice#sql.m5.l4.e1
Tentatives : 0Chargement…

Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Une colonne : e-mail. Ordina par email.

Chargement de l'éditeur…
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

Exercice#sql.m5.l4.e2
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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