CROSS JOIN = (INNER) JOIN = Komma (",")
TL; DR Der einzige Unterschied zwischen SQL CROSS JOIN, (INNER) JOIN und Komma (",") (neben Komma mit niedrigerer Priorität für die Auswertungsreihenfolge) besteht darin, dass (INNER) JOIN ein ON hat, während CROSS JOIN und Komma dies nicht tun.
Zu Zwischenprodukten
Alle drei erzeugen ein relationales konzeptionelles relationales "kartesisches" Produkt im SQL-Stil, auch bekannt als Cross-Join, aller möglichen Kombinationen einer Zeile aus jeder Tabelle. Es ist ON und / oder WHERE, die die Anzahl der Zeilen reduzieren. SQL Fiddle
Der SQL-Standard definiert <comma> über Produkt (7.5 1.b.ii), <cross join> über <comma> (7.7 1.a) und JOIN ON <Suchbedingung> über <comma> plus WHERE (7.7 1.b) ).
Wie Wikipedia es ausdrückt:
Cross Join
CROSS JOIN gibt das kartesische Produkt von Zeilen aus Tabellen im Join zurück. Mit anderen Worten, es werden Zeilen erzeugt, die jede Zeile aus der ersten Tabelle mit jeder Zeile aus der zweiten Tabelle kombinieren.
Innere Verbindung
[...] Das Ergebnis des Joins kann als Ergebnis definiert werden, bei dem zuerst das kartesische Produkt (oder der Cross-Join) aller Datensätze in den Tabellen genommen (jeder Datensatz in Tabelle A mit jedem Datensatz in Tabelle B kombiniert) und dann zurückgegeben wird Alle Datensätze, die das Join-Prädikat erfüllen.
Die "implizite Verknüpfungsnotation" listet einfach die Tabellen für die Verknüpfung in der FROM-Klausel der SELECT-Anweisung auf und verwendet Kommas, um sie zu trennen. Somit wird eine Querverbindung angegeben
Re OUTER JOIN und mit ON vs WHERE in ihnen sehen Bedingungen in LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Warum Spalten zwischen Tabellen vergleichen?
Wenn keine doppelten Zeilen vorhanden sind:
Jede Tabelle enthält die Zeilen, die eine echte Aussage aus einer bestimmten Anweisungsvorlage zum Ausfüllen der [benannten] Lücken machen. (Es macht einen wahren Satz aus - erfüllt - ein bestimmtes (charakteristisches) Prädikat .)
Eine Basistabelle enthält die Zeilen, die aus einer vom DBA angegebenen Anweisungsvorlage eine echte Aussage machen:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Das Zwischenprodukt eines Joins enthält die Zeilen, die eine wahre Aussage aus dem UND der Vorlagen seiner Operanden machen:
/* 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-Bedingungen werden UND-verknüpft, um eine weitere Vorlage zu erhalten. Der Wert sind wieder die Zeilen, die diese Vorlage erfüllen:
/* 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
Insbesondere bedeutet der Vergleich von Spalten auf (SQL-) Gleichheit zwischen Tabellen, dass die Zeilen, die aus den Teilen der Vorlage der verknüpften Tabellen vom Produkt ferngehalten werden, für diese Spalten denselben Wert (nicht NULL) haben. Es ist nur ein Zufall, dass viele Zeilen normalerweise durch Gleichheitsvergleiche zwischen Tabellen entfernt werden. Notwendig und ausreichend ist die Charakterisierung der gewünschten Zeilen.
Schreiben Sie einfach SQL für die Vorlage für die gewünschten Zeilen!
Zur Bedeutung von Abfragen (und Tabellen im Vergleich zu Bedingungen) siehe: Wie werden übereinstimmende Daten aus einer anderen SQL-Tabelle für zwei verschiedene Spalten abgerufen: Inner Join und / oder Union?
Gibt es eine Faustregel zum Erstellen einer SQL-Abfrage aus einer für Menschen lesbaren Beschreibung?
Überladen von "Cross Join"
Leider wird der Begriff "Cross Join" verwendet für:
- Das Zwischenprodukt.
- CROSS JOIN.
- (INNER) VERBINDEN Sie mit einem ON oder WHERE, das keine Spalten aus einer Tabelle mit Spalten einer anderen vergleicht. (Da dies dazu neigt, so viele der Zwischenproduktzeilen zurückzugeben.)
Diese verschiedenen Bedeutungen werden verwechselt. (ZB wie in anderen Antworten und Kommentaren hier.)
Verwenden von CROSS JOIN vs (INNER) JOIN vs Komma
Die übliche Konvention lautet:
- Verwenden Sie CROSS JOIN genau dann, wenn Sie keine Spalten zwischen Tabellen vergleichen. Das soll zeigen, dass das Fehlen von Vergleichen beabsichtigt war.
- Verwenden Sie (INNER) JOIN mit ON, wenn und nur wenn Sie Spalten zwischen Tabellen vergleichen. (Plus möglicherweise andere Bedingungen.)
- Verwenden Sie kein Komma.
Typischerweise werden auch Bedingungen, die nicht auf Tabellenpaaren liegen, für ein WHERE beibehalten. Möglicherweise müssen sie jedoch in einen (n INNER) JOIN ON gesetzt werden, um die entsprechenden Zeilen für das Argument für einen RIGHT, LEFT oder FULL (OUTER) JOIN zu erhalten.
Zu "Komma nicht verwenden" Das Mischen von Komma mit explizitem JOIN kann irreführen, da Komma eine niedrigere Priorität hat. Angesichts der Rolle des Zwischenprodukts im Sinne von CROSS JOIN, (INNER) JOIN und Komma sind die Argumente für die oben genannte Konvention, es überhaupt nicht zu verwenden, wackelig. Ein CROSS JOIN oder Komma ist wie ein (INNER) JOIN, der sich in einem WAHREN Zustand befindet. Ein Zwischenprodukt, ON und WHERE, führen alle ein UND in das entsprechende Prädikat ein. Ansonsten kann man sich INNER JOIN ON vorstellen - beispielsweise eine Ausgabezeile nur dann zu generieren, wenn ein Paar von Eingabezeilen gefunden wird, die die ON-Bedingung erfüllen - und dennoch die Cross-Join-Zeilen zurückgeben, die die Bedingung erfüllen. Der einzige Grund, warum ON das Komma in SQL ergänzen musste , war das Schreiben OUTERJOINs. Natürlich sollte ein Ausdruck seine Bedeutung klar machen; Aber was klar ist, hängt davon ab, was unter Dingen zu verstehen ist.
Zu Venn-Diagrammen Ein Venn-Diagramm mit zwei sich kreuzenden Kreisen kann den Unterschied zwischen Ausgabezeilen für INNER-, LEFT-, RIGHT- und FULL-JOINs für dieselbe Eingabe veranschaulichen. Und wenn das EIN bedingungslos WAHR ist, ist das INNER JOIN-Ergebnis dasselbe wie CROSS JOIN. Es kann auch die Eingabe- und Ausgabezeilen für INTERSECT, UNION & EXCEPT veranschaulichen. Wenn beide Eingaben dieselben Spalten haben, ist das INTERSECT-Ergebnis dasselbe wie für Standard-SQL-NATURAL-JOIN, und das EXCEPT-Ergebnis ist dasselbe wie für bestimmte Redewendungen, die LEFT & RIGHT-JOIN betreffen. Es zeigt jedoch nicht , wie (INNER) JOIN im Allgemeinen funktioniert. Das erscheint auf den ersten Blick nur plausibel . Es kann Teile der Eingabe und / oder Ausgabe für identifizierenSonderfälle von ON, PKs (Primärschlüssel), FKs (Fremdschlüssel) und / oder SELECT. Alles, was Sie tun müssen, um dies zu sehen, ist zu identifizieren, was genau die Elemente der Mengen sind, die durch die Kreise dargestellt werden . (Welche durcheinandergebrachten Präsentationen niemals klar machen.) (Denken Sie daran, dass Ausgabezeilen für Verknüpfungen im Allgemeinen andere Überschriften als Eingabezeilen haben . Und SQL-Tabellen sind Taschen, keine Sätze von Zeilen mit NULL-Werten .)
CROSS JOIN
führt zu allen möglichen Kombinationen der Tabellen. Beispiel: Tabelle1 mit 100 Zeilen und Tabelle2 mit 100 Zeilen führen zu 10000 Datensätzen.