Leçon 5.6 : CROSS JOIN — Le produit cartésien
La plupart des jointures nécessitent une condition de correspondance (ON). Le CROSS JOIN est différent : il retourne toutes les combinaisons possibles de lignes entre les tables jointes. Ce résultat est appelé produit cartésien.
Qu'est-ce qu'un CROSS JOIN ?
Un CROSS JOIN produit un résultat dont le nombre de lignes est le produit du nombre de lignes de la première table par celui de la seconde. Il n'y a pas de condition de correspondance : chaque ligne de la table A rencontre chaque ligne de la table B.
Visualisation :
Table A (Couleurs) Table B (Tailles)
+-----------+ +-----------+
| couleur | | taille |
+-----------+ +-----------+
| Rouge | --\ | Petit |
| Bleu | ---|------> | Moyen |
+-----------+ --/ | Grand |
+-----------+
Résultat (Combinaisons) :
Rouge, Petit
Rouge, Moyen
Rouge, Grand
Bleu, Petit
Bleu, Moyen
Bleu, Grand
Si la table A a 2 lignes et la table B en a 3, le résultat aura 2 x 3 = 6 lignes.
Syntaxe du CROSS JOIN
Il existe deux façons d'écrire un produit cartésien :
-- Syntaxe explicite
SELECT
table1.column,
table2.column
FROM
table1
CROSS JOIN
table2;
-- Syntaxe implicite avec virgule
SELECT
table1.column,
table2.column
FROM
table1,
table2;
Il est important de comprendre que ces deux formes diffèrent non seulement par le style, mais aussi par la priorité des opérations.
- Un
JOINexplicite a une priorité plus élevée et s'exécute dans la même chaîne que les autresJOINdu texte de la requête. - La syntaxe avec virgule a une priorité plus faible et n'est traitée qu'après les
JOINexplicites.
À cause de cela, mélanger la virgule et les JOIN explicites dans un même FROM peut changer le sens de la requête ou même provoquer une erreur.
Par exemple, la requête suivante est incorrecte :
FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)
Pourquoi c'est une erreur :
- d'abord, le
b JOIN cexplicite est exécuté ; - à ce stade, la table
an'est pas encore dans la portée de cette jointure ; - la référence à
a.xdans la clauseONest donc invalide.
C'est pour cette raison que le CROSS JOIN explicite est généralement préférable : non pas simplement parce qu'il est « plus clair », mais parce qu'il s'accorde mieux avec les autres JOIN et évite des problèmes cachés de priorité.
Attention : Soyez prudent avec
CROSS JOINsur de grandes tables. Joindre deux tables de 1 000 lignes chacune produira 1 000 000 lignes !
Exemples pratiques (base Sakila)
1. Générer toutes les combinaisons possibles
Créer un rapport qui montre chaque catégorie de film pour chaque magasin, même si le magasin n'a pas de films dans cette catégorie.
SELECT
s.store_id,
c.name AS category_name
FROM
store AS s
CROSS JOIN
category AS c;
Cela produit une liste de toutes les catégories pour le magasin 1, puis pour le magasin 2.
2. Générer des données de test ou des matrices
CROSS JOIN est souvent utilisé pour générer des permutations pour des tests ou pour construire des calendriers où il faut voir tous les créneaux horaires pour tous les utilisateurs.
Quand utiliser CROSS JOIN
- Générer des permutations : Quand vous avez besoin de toutes les combinaisons possibles (ex. toutes les couleurs de produit vs toutes les tailles).
- Combler les manques : Avec un
LEFT JOIN, il permet d'identifier les combinaisons manquantes dans vos données. - Reporting : Pour créer la "structure" d'un rapport qui doit inclure toutes les catégories, même celles sans valeur.
Points clés de cette leçon
- CROSS JOIN retourne le produit cartésien de deux tables.
- Il n'utilise pas de clause
ON(pas de condition de correspondance). - Le nombre de lignes du résultat est le produit du nombre de lignes de chaque table.
- À utiliser avec prudence sur de grands ensembles pour éviter les problèmes de performance.