Jaka jest różnica między "INNER JOIN" a "OUTER JOIN"?

Jak również pasują LEFT JOIN, RIGHT JOIN i FULL JOIN?

Rozwiązanie

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:

A    B
-    -
1    3
2    4
3    5
4    6

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.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Lewe złączenie zewnętrzne

Złączenie zewnętrzne lewe daje wszystkie wiersze w A, plus wszystkie wspólne wiersze w B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Prawe złączenie zewnętrzne

Złączenie zewnętrzne prawe daje wszystkie wiersze w B, plus wszystkie wspólne wiersze w A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

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.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
Komentarze (17)

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.

Komentarze (0)

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.

  • OrderID
  • CustomerName

OrderDetails

  • OrderDetailID
  • OrderID
  • ProductName
  • Qty
  • Cena

Zapytanie

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

zwróci tylko te zamówienia, które mają również coś w tabeli OrderDetails.

Jeśli zmienisz to na OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

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.

Komentarze (1)