CROSS JOIN = (INNER) JOIN = virgule (",")
TL;DR La seule différence entre le CROSS JOIN SQL, le (INNER) JOIN et la virgule (",") (outre le fait que la virgule est moins prioritaire pour l'ordre d'évaluation) est que le (INNER) JOIN a un ON alors que le CROSS JOIN et la virgule n'en ont pas.
Re produits intermédiaires
Toutes trois produisent un produit relationnel "cartésien" intermédiaire conceptuel de type SQL, c'est-à-dire une jointure croisée, de toutes les combinaisons possibles d'une ligne de chaque table. Ce sont ON et/ou WHERE qui réduisent le nombre de lignes. Fiddle SQL
La norme SQL définit <comma> via product (7.5 1.b.ii), <cross join> alias CROSS JOIN via <comma> (7.7 1.a) et (INNER) JOIN ON <search condition> via <comma> plus WHERE (7.7 1.b).
Comme le dit Wikipedia :
Jointure transversale
CROSS JOIN renvoie le produit cartésien des lignes des tables de la jointure. En d'autres termes, elle produit des lignes qui combinent chaque ligne de la première table avec chaque ligne de la deuxième table.
Jointure interne
[...] Le résultat de la jointure peut être défini comme le résultat du produit cartésien (ou jointure croisée) de tous les enregistrements des tables (combinant chaque enregistrement de la table A avec chaque enregistrement de la table B), puis du renvoi de tous les enregistrements qui satisfont au prédicat de la jointure.
La "notation de jointure implicite" énumère simplement les tables à joindre, dans la clause FROM de l'instruction SELECT, en utilisant des virgules pour les séparer. Elle spécifie ainsi une jointure croisée
Re OUTER JOIN voir ma réponse Quelle est la différence entre "INNER JOIN" et "OUTER JOIN" ? .
Concernant les OUTER JOINs et l'utilisation de ON vs WHERE dans ceux-ci, voir ma réponse. Conditions dans LEFT JOIN (OUTER JOIN) par rapport à INNER JOIN .
Pourquoi comparer des colonnes entre tableaux ?
Lorsqu'il n'y a pas de lignes en double :
Chaque tableau contient les lignes qui constituent une déclaration vraie à partir d'un certain modèle de déclaration à remplir dans les blancs. (Il s'agit d'une affirmation vraie proposition de-- satisfait à -- un certain prédicat (caractéristique) .)
-
Une table de base contient les lignes qui constituent une déclaration vraie à partir d'un modèle de déclaration donné par le DBA :
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
-
Le produit intermédiaire d'une jointure contient les lignes qui forment une déclaration vraie à partir du ET des modèles de ses opérandes :
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
-
Les conditions ON et WHERE sont combinées par AND pour fournir un modèle supplémentaire. La valeur est à nouveau constituée des lignes qui satisfont à ce modèle :
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
En particulier, la comparaison des colonnes pour l'égalité (SQL) entre les tables signifie que les lignes conservées du produit des parties du modèle des tables jointes ont la même valeur (non NULL) pour ces colonnes. C'est juste une coïncidence qu'un grand nombre de lignes soient typiquement supprimées par les comparaisons d'égalité entre les tables - ce qui est nécessaire et suffisant est de caractériser les lignes que vous voulez.
Il suffit d'écrire du SQL pour le modèle pour les lignes que vous voulez !
En ce qui concerne la signification des requêtes (et des tables par rapport aux conditions), voir :
Comment obtenir des données correspondantes d'une autre table SQL pour deux colonnes différentes : Jointure interne et/ou union ?
Existe-t-il une règle empirique pour construire une requête SQL à partir d'une description lisible par l'homme ?
Surcharge de la fonction "jointure croisée".
Malheureusement, le terme "jointure croisée" est utilisé pour.. :
- Le produit intermédiaire.
- CROSS JOIN.
- (INNER) JOIN avec un ON ou WHERE qui ne compare pas les colonnes d'une table à celles d'une autre. (Puisque cela a tendance à retourner un grand nombre de lignes de produits intermédiaires).
Ces différentes significations se confondent. (Par exemple, comme dans d'autres réponses et commentaires ici).
Utilisation de CROSS JOIN vs (INNER) JOIN vs virgule
La convention commune est la suivante :
- Utilisez le CROSS JOIN quand et seulement quand vous ne comparez pas les colonnes entre les tables. Cela permet de montrer que l'absence de comparaisons était intentionnelle.
- Utilisez (INNER) JOIN avec ON quand et seulement quand vous comparez des colonnes entre les tables. (Plus éventuellement d'autres conditions).
- N'utilisez pas de virgule.
Généralement, les conditions ne portant pas sur des paires de tables sont également conservées pour un WHERE. Mais elles peuvent être placées dans un (n INNER) JOIN ON pour obtenir les lignes appropriées pour l'argument d'un RIGHT, LEFT ou FULL (OUTER) JOIN.
Re "Ne pas utiliser de virgule" Mélanger la virgule avec le JOIN explicite peut induire en erreur car la virgule a une priorité inférieure. Mais étant donné le rôle du produit intermédiaire dans la signification de CROSS JOIN, (INNER) JOIN et virgule, les arguments en faveur de la convention ci-dessus consistant à ne pas l'utiliser du tout sont peu convaincants. Un CROSS JOIN ou une virgule est tout comme un (INNER) JOIN qui est sur une condition VRAIE. Un produit intermédiaire, ON et WHERE introduisent tous un AND dans le prédicat correspondant. Quelle que soit la manière dont on conçoit INNER JOIN ON - par exemple, en générant une ligne de sortie uniquement lorsqu'on trouve une paire de lignes d'entrée qui satisfait à la condition ON - elle renvoie néanmoins les lignes de la jointure croisée qui satisfont à la condition. La seule raison pour laquelle ON avait pour compléter la virgule en SQL était d'écrire OUTER JOINs. Bien sûr, une expression doit être claire, mais ce qui est clair dépend de ce que l'on entend par là.
Re Diagrammes de Venn Un diagramme de Venn avec deux cercles qui se croisent peut illustrer la différence entre lignes de sortie pour les INNER, LEFT, RIGHT & FULL JOINs pour la même entrée. Et lorsque ON est inconditionnellement VRAI, le résultat du INNER JOIN est le même que celui du CROSS JOIN. Il peut également illustrer le lignes d'entrée et de sortie pour INTERSECT, UNION & EXCEPT. Et lorsque les deux entrées ont les mêmes colonnes, le résultat de l'INTERSECT est le même que celui du NATURAL JOIN SQL standard, et le résultat de l'EXCEPT est le même que celui de certains idiomes impliquant LEFT & RIGHT JOIN. Mais il est vrai que pas illustrer comment le (INNER) JOIN fonctionne en général. C'est juste semble plausible à première vue . Il peut identifier pièces d'entrée et/ou de sortie pour cas particuliers de ON, PKs (clés primaires), FKs (clés étrangères) et/ou SELECT. Pour s'en rendre compte, il suffit d'identifier Quels sont exactement les éléments des ensembles représentés par les cercles ? . (Ce que les présentations confuses ne rendent jamais clair.) Rappelez-vous qu'en général pour les jointures les lignes de sortie ont des titres différents des lignes d'entrée . Et les tables SQL sont sacs pas fixe de rangs avec des NULLs .