Maintenez SQLtest en vie : Aidez à couvrir les coûts du serveur de ce mois-ci de 100 $ pour garder toutes les leçons et le terrain de jeu SQL en ligne. Soutenez le projet →
Code SQL copié dans le presse-papiers

Leçon 5.6 · Temps de lecture : ~5 min

Le SQL CROSS JOIN combine chaque ligne d'une table avec chaque ligne d'une autre ; le résultat s'appelle le produit cartésien. Dans cette leçon, vous apprendrez la syntaxe de CROSS JOIN, la taille de son résultat, et comment l'utiliser pour construire des grilles de rapport qui affichent des zéros au lieu de lignes manquantes.

SQL CROSS JOIN : toutes les combinaisons de lignes

Toutes les jointures vues jusqu'ici associaient des lignes selon une condition. CROSS JOIN n'a pas de condition : chaque ligne de la première table rencontre chaque ligne de la seconde. C'est rarement ce que l'on veut pour des données liées, mais c'est exactement ce qu'il faut pour générer toutes les combinaisons : chaque magasin avec chaque catégorie, chaque produit avec chaque taille, chaque jour avec chaque employé.

SQL CROSS JOIN : chaque ligne de la première table combinée avec chaque ligne de la seconde, 2 magasins fois 16 catégories donnent 32 lignes

Ce que renvoie CROSS JOIN

Si la première table a m lignes et la seconde n lignes, le résultat a m × n lignes. Il n'y a pas de clause ON.

Syntaxe de base

SELECT table1.column1, table2.column2
FROM table1
CROSS JOIN table2;

L'ancienne syntaxe avec virgule, FROM table1, table2 sans condition, signifie la même chose. CROSS JOIN exprime l'intention explicitement et est préférable.


Exemple : chaque magasin avec chaque catégorie

SELECT s.store_id, c.name AS category
FROM store AS s
CROSS JOIN category AS c
ORDER BY s.store_id, c.name;

Résultat : 32 lignes : 2 magasins × 16 catégories, chaque magasin avec chaque catégorie.


Construire une grille de rapport

L'usage le plus pratique de CROSS JOIN est le « squelette » d'un rapport. Supposons que vous ayez besoin du nombre de films par magasin et par catégorie, y compris les combinaisons sans aucun film. Une jointure classique avec GROUP BY ne renvoie que les combinaisons présentes dans les données. Un CROSS JOIN crée d'abord toutes les combinaisons, puis un LEFT JOIN y rattache les données :

SELECT s.store_id,
       c.name AS category,
       COUNT(i.inventory_id) AS copies
FROM store AS s
CROSS JOIN category AS c
LEFT JOIN film_category AS fc ON fc.category_id = c.category_id
LEFT JOIN inventory AS i ON i.film_id = fc.film_id
                        AND i.store_id = s.store_id
GROUP BY s.store_id, c.name
ORDER BY s.store_id, c.name;

Résultat : 32 lignes avec le nombre d'exemplaires de films de chaque catégorie dans chaque magasin. Une combinaison sans exemplaire afficherait 0 au lieu de disparaître.

COUNT(i.inventory_id) ne compte que les exemplaires trouvés, donc une combinaison sans exemplaire obtient 0. La même technique comble les trous des séries temporelles : un produit cartésien entre une liste de dates et une liste de produits donne une ligne par produit et par jour.


Le produit cartésien accidentel

Un produit cartésien apparaît souvent par erreur, quand une condition de jointure manque :

-- Pas de condition de jointure : chaque acteur est combiné avec chaque film
SELECT COUNT(*) AS row_count
FROM actor, film;

Résultat : 200 000 lignes : 200 acteurs × 1000 films.

Si une requête renvoie soudain beaucoup trop de lignes, ou si des lignes se répètent dans des combinaisons étranges, vérifiez que chaque table jointe a une condition de jointure. Deux tables de 100 000 lignes chacune produisent 10 milliards de combinaisons, ce qui peut bloquer la base de données.


Points clés :

  • CROSS JOIN combine chaque ligne d'une table avec chaque ligne d'une autre.
  • Le résultat a m × n lignes et pas de condition ON.
  • FROM a, b sans condition est aussi un produit cartésien, souvent accidentel.
  • CROSS JOIN plus LEFT JOIN construit une grille de rapport complète, avec des zéros pour les combinaisons absentes.
  • Vérifiez la taille du résultat avant de faire un produit cartésien sur de grandes tables.

Questions fréquentes

Qu'est-ce qu'un produit cartésien en SQL ?

L'ensemble de toutes les combinaisons de lignes de deux tables. Si une table a 2 lignes et l'autre 16, le produit cartésien a 32 lignes. CROSS JOIN le renvoie explicitement.

Quelle est la différence entre CROSS JOIN et INNER JOIN ?

INNER JOIN ne garde que les combinaisons qui satisfont la condition ON. CROSS JOIN garde toutes les combinaisons. Un INNER JOIN avec une condition toujours vraie se comporte comme un CROSS JOIN.

Quand faut-il utiliser CROSS JOIN ?

Quand vous avez besoin de toutes les combinaisons : grilles de rapport, variantes de produits (couleurs × tailles), calendriers (dates × employés) ou pour combler les trous des séries temporelles avec un LEFT JOIN.