CROSS JOIN = (INNER) JOIN = virgule (",")
TL; DR La seule différence entre SQL CROSS JOIN, (INNER) JOIN et virgule (",") (outre la virgule ayant une priorité inférieure pour l'ordre d'évaluation) est que (INNER) JOIN a un ON alors que CROSS JOIN et la virgule ne le font pas.
Concernant les produits intermédiaires
Tous trois produisent un produit «cartésien» relationnel conceptuel intermédiaire de style SQL, également appelé jointure croisée, de toutes les combinaisons possibles d'une ligne de chaque table. C'est ON et / ou WHERE qui réduisent le nombre de lignes. Violon SQL
Le standard SQL définit <comma> via produit (7.5 1.b.ii), <cross join> via <comma> (7.7 1.a) et JOIN ON <condition de recherche> via <comma> plus WHERE (7.7 1.b ).
Comme le dit Wikipedia:
Jointure croisée
CROSS JOIN renvoie le produit cartésien des lignes des tables de la jointure. En d'autres termes, il produira des lignes qui combinent chaque ligne de la première table avec chaque ligne de la seconde table.
Jointure interne
[...] Le résultat de la jointure peut être défini comme le résultat de la première prise du produit cartésien (ou jointure croisée) de tous les enregistrements dans les tables (combinant chaque enregistrement de la table A avec chaque enregistrement de la table B), puis le retour tous les enregistrements qui satisfont le prédicat de jointure.
La "notation de jointure implicite" répertorie simplement les tables à joindre, dans la clause FROM de l'instruction SELECT, en utilisant des virgules pour les séparer. Ainsi, il spécifie une jointure croisée
Re OUTER JOIN et en utilisant ON vs WHERE dans les voir Conditions de jointure LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Pourquoi comparer des colonnes entre des tables?
Lorsqu'il n'y a pas de lignes en double:
Chaque table contient les lignes qui constituent une déclaration vraie à partir d'un certain modèle de déclaration de remplissage [named-] blanks. (Il fait une proposition vraie à partir de - satisfait - un certain prédicat (caractéristique) .)
Une table de base contient les lignes qui font une vraie déclaration à partir d'un modèle de déclaration donné par 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 font 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
ON & WHERE les conditions sont ET ajoutées pour donner un modèle supplémentaire. La valeur correspond à nouveau aux 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 à partir des parties du modèle des tables jointes ont la même valeur (non NULL) pour ces colonnes. C'est juste une coïncidence que beaucoup de lignes sont généralement supprimées par des comparaisons d'égalité entre les tables - ce qui est nécessaire et suffisant est de caractériser les lignes que vous voulez.
Écrivez simplement SQL pour le modèle pour les lignes que vous voulez!
Concernant 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 "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 aucune colonne d'une table à aucune colonne d'une autre. (Étant donné que cela a tendance à renvoyer autant 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:
- Utilisez CROSS JOIN lorsque et seulement lorsque vous ne comparez pas les colonnes entre les tables. C'est pour montrer que le manque de comparaisons était intentionnel.
- Utilisez (INNER) JOIN avec ON lorsque et seulement lorsque vous comparez des colonnes entre des tables. (Plus éventuellement d'autres conditions.)
- N'utilisez pas de virgule.
En règle générale, les conditions ne figurant pas sur des paires de tables sont également conservées pour un WHERE. Mais ils devront peut-être être placés dans un (n INNER) JOIN ON pour obtenir les lignes appropriées pour l'argument de RIGHT, LEFT ou FULL (OUTER) JOIN.
Re "Ne pas utiliser de virgule" Le mélange de virgule avec 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 le sens de CROSS JOIN, (INNER) JOIN et virgule, les arguments pour la convention ci-dessus de ne pas l'utiliser du tout sont fragiles. Un CROSS JOIN ou une virgule est juste comme un (INNER) JOIN qui est sur une condition TRUE. Un produit intermédiaire, ON et WHERE introduisent tous un ET dans le prédicat correspondant. Cependant, on peut penser à INNER JOIN ON - par exemple, générer une ligne de sortie uniquement lors de la recherche d'une paire de lignes d'entrée qui satisfait à la condition ON - il renvoie néanmoins les lignes de jointure croisée qui satisfont à la condition. La seule raison pour laquelle ON devait compléter la virgule en SQL était d'écrire OUTERJOINs. Bien entendu, une expression doit rendre sa signification claire; mais ce qui est clair dépend de ce que les choses signifient.
Diagrammes de Re Venn Un diagramme de Venn avec deux cercles qui se croisent peut illustrer la différence entre les lignes de sortie pour les JOINTS INNER, LEFT, RIGHT & FULL pour la même entrée. Et lorsque ON est inconditionnellement TRUE, le résultat INNER JOIN est le même que CROSS JOIN. Il peut également illustrer les 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 INTERSECT est le même que pour SQL NATURAL JOIN standard, et le résultat EXCEPT est le même que pour certains idiomes impliquant LEFT & RIGHT JOIN. Mais cela n'illustre pas comment (INNER) JOIN fonctionne en général. Cela semble plausible à première vue . Il peut identifier les parties d'entrée et / ou de sortie pourcas particuliers de ON, PK (clés primaires), FK (clés étrangères) et / ou SELECT. Tout ce que vous avez à faire pour voir cela est d'identifier quels sont exactement les éléments des ensembles représentés par les cercles . (Les présentations confuses ne sont jamais claires.) (N'oubliez pas qu'en général, pour les jointures, les lignes de sortie ont des en-têtes différents des lignes d'entrée . Et les tables SQL sont des sacs et non des ensembles de lignes avec NULL .)
CROSS JOIN
entraînera toutes les combinaisons possibles des tableaux. Par exemple, Table1 avec 100 lignes et Table2 avec 100 lignes donneront 10000 enregistrements.