Więcej
Jaka jest różnica między "INNER JOIN" a "OUTER JOIN"?
Jak również pasują LEFT JOIN
, RIGHT JOIN
i FULL JOIN
?
4488
3
Jak również pasują LEFT JOIN
, RIGHT JOIN
i FULL JOIN
?
Zakładając, że łączysz się z kolumnami bez duplikatów, co jest bardzo częstym przypadkiem:
Wewnętrzne złączenie A i B daje wynik A intersect B, czyli wewnętrzną część przecięcia diagramu Venn.
Zewnętrzne złączenie A i B daje wynik A union B, tj. zewnętrzne części unii diagramu Venn.
Przykłady.
Załóżmy, że mamy dwie tabele, każda z jedną kolumną, a dane są następujące:
Zauważ, że (1,2) są unikalne dla A, (3,4) są wspólne, a (5,6) są unikalne dla B.
Złączenie wewnętrzne
Złączenie wewnętrzne przy użyciu jednego z równoważnych zapytań daje przecięcie dwóch tabel, tj. dwa wiersze, które mają wspólne.
Lewe złączenie zewnętrzne
Złączenie zewnętrzne lewe daje wszystkie wiersze w A, plus wszystkie wspólne wiersze w B.
Prawe złączenie zewnętrzne
Złączenie zewnętrzne prawe daje wszystkie wiersze w B, plus wszystkie wspólne wiersze w A.
Pełne złączenie zewnętrzne
Pełne złączenie zewnętrzne da ci unię A i B, tj. wszystkie wiersze w A i wszystkie wiersze w B. Jeśli coś w A nie ma odpowiadającej wartości w B, to część B jest zerowa i vice versa.
Złączenie wewnętrzne pokazuje wiersze tylko wtedy, gdy istnieje pasujący rekord po drugiej (prawej) stronie złączenia.
Złączenie zewnętrzne (lewe) pokazuje wiersze dla każdego rekordu po lewej stronie, nawet jeśli nie ma pasujących wierszy po drugiej (prawej) stronie złączenia. Jeśli nie ma pasującego wiersza, kolumny po drugiej (prawej) stronie złączenia będą miały wartość NULL.
Złączenia wewnętrzne wymagają, aby rekord z powiązanym ID istniał w połączonej tabeli.
Złączenia zewnętrzne zwrócą rekordy dla lewej strony, nawet jeśli nic nie istnieje dla prawej strony.
Na przykład, masz tabelę Orders i OrderDetails. Są one powiązane przez "OrderID".
Orders.
OrderDetails
Zapytanie
zwróci tylko te zamówienia, które mają również coś w tabeli OrderDetails.
Jeśli zmienisz to na OUTER LEFT JOIN
to zwróci rekordy z tabeli Orders, nawet jeśli nie mają one rekordów OrderDetails.
Możesz użyć tego do znalezienia zamówień, które nie mają żadnych OrderDetails wskazujących na możliwe osierocone zamówienie poprzez dodanie klauzuli where jak
WHERE OrderDetails.OrderID IS NULL
.