CROSS JOIN = (INNER) JOIN = przecinek („,”)
TL; DR Jedyną różnicą między SQL CROSS JOIN, (INNER) JOIN i przecinkiem („,”) (poza przecinkiem o niższym priorytecie dla kolejności oceny) jest to, że (INNER) JOIN ma ON, podczas gdy CROSS JOIN i przecinek nie.
Produkty pośrednie
Wszystkie trzy tworzą pośredni, konceptualny produkt „kartezjański” w stylu SQL, nazywany łączeniem krzyżowym wszystkich możliwych kombinacji wiersza z każdej tabeli. Jest ON i / lub GDZIE, które zmniejszają liczbę wierszy. SQL Fiddle
Standard SQL definiuje <comma> za pośrednictwem produktu (7.5 1.b.ii), <łączenie krzyżowe> przez <comma> (7.7 1.a) i JOIN ON <warunek wyszukiwania> przez <comma> plus WHERE (7.7 1.b ).
Jak podaje Wikipedia:
Łączenie krzyżowe
CROSS JOIN zwraca iloczyn kartezjański wierszy z tabel w złączeniu. Innymi słowy, utworzy wiersze, które łączą każdy wiersz z pierwszej tabeli z każdym wierszem z drugiej tabeli.
Połączenie wewnętrzne
[...] Wynik sprzężenia można zdefiniować jako wynik pierwszego obliczenia iloczynu kartezjańskiego (lub sprzężenia krzyżowego) wszystkich rekordów w tabelach (połączenie każdego rekordu w tabeli A z każdym rekordem w tabeli B), a następnie zwrócenia wszystkie rekordy spełniające predykat łączenia.
„Notacja niejawnego łączenia” po prostu wymienia tabele do łączenia, w klauzuli FROM instrukcji SELECT, używając przecinków do ich oddzielenia. W ten sposób określa sprzężenie krzyżowe
W przypadku ZEWNĘTRZNYCH JOIN i używania opcji ON vs WHERE w nich zobacz Warunki w LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Po co porównywać kolumny między tabelami?
Gdy nie ma zduplikowanych wierszy:
Każda tabela zawiera wiersze, które składają się na prawdziwe stwierdzenie z określonego szablonu instrukcji wypełniania [nazwanych] pustych miejsc. (To sprawia, że prawdziwa propozycja from-- spełnia -A pewną (charakterystyczny) predykat ).
Tabela podstawowa zawiera wiersze, które zawierają prawdziwe oświadczenie z szablonu instrukcji podanego przez DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Produkt pośredni sprzężenia zawiera wiersze, które tworzą prawdziwe stwierdzenie z AND z szablonów argumentów:
/* 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 warunki są wstawiane AND, aby dać kolejny szablon. Wartością są ponownie wiersze, które spełniają wymagania tego szablonu:
/* 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
W szczególności porównanie kolumn dla równości (SQL) między tabelami oznacza, że wiersze zachowane z produktu z części szablonu połączonych tabel mają tę samą (inną niż NULL) wartość dla tych kolumn. To po prostu przypadek, że wiele wierszy jest zwykle usuwanych przez porównania równości między tabelami - konieczne i wystarczające jest scharakteryzowanie żądanych wierszy.
Po prostu napisz SQL dla szablonu dla żądanych wierszy!
Co do znaczenia zapytań (i tabel a warunków) zobacz:
Jak uzyskać pasujące dane z innej tabeli SQL dla dwóch różnych kolumn: Inner Join i / lub Union?
Czy jest jakaś praktyczna zasada konstruowania zapytania SQL na podstawie opisu czytelnego dla człowieka?
Przeciążanie połączenia krzyżowego
Niestety, termin „łączenie krzyżowe” jest używany do:
- Produkt pośredni.
- CROSS JOIN.
- (INNER) JOIN z wartością ON lub WHERE, która nie porównuje żadnych kolumn z jednej tabeli z żadnymi kolumnami innej. (Ponieważ powoduje to zwrócenie tak wielu pośrednich wierszy produktów).
Te różne znaczenia zostają zmieszane. (Np. Jak w innych odpowiedziach i komentarzach tutaj.)
Używanie CROSS JOIN vs (INNER) JOIN vs comma
Wspólna konwencja to:
- Użyj CROSS JOIN tylko wtedy, gdy nie porównujesz kolumn między tabelami. Ma to pokazać, że brak porównań był zamierzony.
- Użyj opcji (INNER) JOIN z wartością ON wtedy i tylko wtedy, gdy porównujesz kolumny między tabelami. (Oraz ewentualnie inne warunki.)
- Nie używaj przecinka.
Zwykle również warunki, które nie znajdują się na parach tabel, są przechowywane dla GDZIE. Ale może być konieczne umieszczenie ich w (n INNER) JOIN ON, aby uzyskać odpowiednie wiersze dla argumentu DOŁĄCZENIA PRAWEGO, LEWEGO lub PEŁNEGO (ZEWNĘTRZNEGO).
Re „Nie używaj przecinka” Mieszanie przecinka z jawnym JOIN może wprowadzać w błąd, ponieważ przecinek ma niższy priorytet. Ale biorąc pod uwagę rolę produktu pośredniego w znaczeniu CROSS JOIN, (INNER) JOIN i przecinka, argumenty za powyższą konwencją w ogóle go nie używają są niepewne. CROSS JOIN lub przecinek jest podobny do (INNER) JOIN, który ma PRAWDA. Iloczyn pośredni, ON i WHERE, wszystkie wprowadzają AND w odpowiednim predykacie. Jednak w innym przypadku można pomyśleć o INNER JOIN ON - powiedzmy, generowaniu wiersza wyjściowego tylko wtedy, gdy znajduje się para wierszy wejściowych, które spełniają warunek ON - mimo to zwraca wiersze sprzężenia krzyżowego, które spełniają warunek. Jedynym powodem, dla którego ON musiał uzupełniać przecinek w SQL, było pisanie OUTERDOŁĄCZA. Oczywiście wyrażenie powinno jasno określać swoje znaczenie; ale to, co jest jasne, zależy od tego, jakie rzeczy mają oznaczać.
Diagramy Re Venna Diagram Venna z dwoma przecinającymi się okręgami może zilustrować różnicę między wierszami wyjściowymi dla WEWNĘTRZNYCH, W LEWO, PRAWO i PEŁNYCH SPRZĘŻEŃ dla tego samego wejścia. A kiedy ON jest bezwarunkowo PRAWDA, wynik INNER JOIN jest taki sam jak CROSS JOIN. Może również zilustrować wiersze wejściowe i wyjściowe dla INTERSECT, UNION & EXCEPT. A gdy oba wejścia mają te same kolumny, wynik INTERSECT jest taki sam, jak dla standardowego SQL NATURAL JOIN, a wynik EXCEPT jest taki sam, jak dla niektórych idiomów obejmujących LEFT & RIGHT JOIN. Ale nie ilustruje, jak ogólnie działa funkcja (INNER) JOIN. Na pierwszy rzut oka wydaje się to prawdopodobne . Może identyfikować części danych wejściowych i / lub wyjściowych dlaspecjalne przypadki ON, PK (klucze podstawowe), FK (klucze obce) i / lub SELECT. Wszystko, co musisz zrobić, aby to zobaczyć, to określić, jakie dokładnie są elementy zestawów reprezentowanych przez koła . (Które niejasne prezentacje nigdy nie wyjaśniają.) (Pamiętaj, że generalnie w przypadku złączeń wiersze wyjściowe mają inne nagłówki niż wiersze wejściowe . A tabele SQL to worki, a nie zestawy wierszy z wartościami NULL ).
CROSS JOIN
da w wyniku wszystkie możliwe kombinacje tabel. np. Tabela 1 ze 100 wierszami i Tabela 2 ze 100 wierszami da 10000 rekordów.