Inner Join Vs Outer Join: Exact Difference With Examples

Inner Join Vs Outer Join: Get Ready to Explore the Exact Differences Between Inner and Outer Join

Before exploring the differences between Inner Join Vs Outer Join, let us first see what is a SQL JOIN?

Klauzula złączenia jest używana do łączenia rekordów lub do manipulowania rekordami z dwóch lub więcej tabel poprzez warunek złączenia. Warunek złączenia wskazuje, jak kolumny z każdej tabeli są dopasowywane do siebie.

Złączenie jest oparte na powiązanej kolumnie między tymi tabelami. Najczęstszym przykładem jest połączenie między dwoma tabelami poprzez kolumnę klucza podstawowego i obcego.

INNER JOIN VS OUTER JOIN

Załóżmy, że mamy tabelę, która zawiera wynagrodzenie pracownika i jest inna tabela, która zawiera szczegóły pracownika.

W tym przypadku, będzie wspólna kolumna jak ID pracownika, która połączy te dwie tabele. Ta kolumna ID pracownika będzie kluczem podstawowym w tabelach szczegółów pracownika i kluczem obcym w tabeli wynagrodzenia pracownika.

Bardzo ważne jest, aby mieć wspólny klucz między dwoma podmiotami. Możesz myśleć o tabeli jako o encji, a o kluczu jako o wspólnym łączniku między dwoma tabelami, który jest używany do operacji łączenia.

Podstawowo, istnieją dwa rodzaje złączeń w SQL tj. złączenie wewnętrzne i złączenie zewnętrzne. Zewnętrzne złączenie jest dalej podzielone na trzy typy tj. Left Outer Join, Right Outer Join i Full Outer Join.

W tym artykule zobaczymy różnicę pomiędzy Inner Join i Outer Join w szczegółach. Złączenia krzyżowe i nierówne pozostaną poza zakresem tego artykułu.

Co to jest złączenie wewnętrzne?

Złączenie wewnętrzne zwraca tylko wiersze, które mają pasujące wartości w obu tabelach (rozważamy tutaj złączenie między dwiema tabelami).

Co to jest złączenie zewnętrzne?

Złączenie zewnętrzne zawiera pasujące wiersze, jak również niektóre z niedopasowanych wierszy między dwiema tabelami. Złączenie zewnętrzne różni się od złączenia wewnętrznego tym, jak radzi sobie z warunkiem fałszywego dopasowania.

Istnieją 3 typy złączenia zewnętrznego:

  • Złączenie zewnętrzne lewe: Zwraca wszystkie wiersze z tabeli LEFT i pasujące rekordy między obiema tabelami.
  • Right Outer Join: Zwraca wszystkie wiersze z tabeli RIGHT i pasujące rekordy między obiema tabelami.
  • Full Outer Join: Łączy wynik Left Outer Join i Right Outer Join.

Różnica między Inner i Outer Join

Różnica między INNER JOIN i OUTER JOIN

Jak pokazano na powyższym diagramie, istnieją dwie encje tj. tabela 1 i tabela 2 i obie tabele mają pewne wspólne dane.

Złączenie wewnętrzne zwróci wspólny obszar między tymi tabelami (zielony zacieniony obszar na powyższym diagramie), tj. wszystkie rekordy, które są wspólne między tabelą 1 i tabelą 2.

Złączenie zewnętrzne lewe zwróci wszystkie wiersze z tabeli 1 i tylko te wiersze z tabeli 2, które są również wspólne z tabelą 1. Złączenie zewnętrzne prawe zrobi coś zupełnie przeciwnego. Da wszystkie rekordy z tabeli 2 i tylko odpowiadające im pasujące rekordy z tabeli 1.

Ponadto, Full Outer Join da nam wszystkie rekordy z tabeli 1 i tabeli 2.

Zacznijmy od przykładu, aby to wyjaśnić.

Załóżmy, że mamy dwie tabele: EmpDetails i EmpSalary.

Tabela EmpDetails:

2 Samantha 3 Hakuna 4 Silky 5 5 Ram 6 Arpit 7 Lily 8 Sita 8 Sita

. 9 Farah 10 Jerry

Tabela wynagrodzeń pracowników:

.

.

.

.

.

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
11 Rose 90000
12 Sakshi 45000
13 Jack 250000

Zróbmy Inner Join na tych dwóch tabelach i obserwujmy wynik:

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails INNER JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

.

.

.

.

EmployeeID EmployeeName EmployeeSalary
1 John 50000
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000

W powyższym zestawie wyników, widać, że Inner Join zwróciło pierwsze 6 rekordów, które były obecne zarówno w EmpDetails jak i EmpSalary posiadających pasujący klucz tj.tj. EmployeeID. Stąd, jeśli A i B są dwoma podmiotami, Inner Join zwróci zestaw wyników, który będzie równy „Rekordy w A i B”, w oparciu o pasujący klucz.

Zobaczmy teraz, co zrobi Left Outer Join.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails LEFT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
7 Lily NULL
8 Sita Sita NULL
9 Farah NULL
10 Jerry NULL

W powyższym zbiorze wyników, można zauważyć, że złączenie zewnętrzne lewe zwróciło wszystkie 10 rekordów z tabeli LEFT tj.EmpDetails, a ponieważ pierwsze 6 rekordów jest pasujących, zwrócił wynagrodzenie pracownika dla tych pasujących rekordów.

Jako że reszta rekordów nie ma pasującego klucza w tabeli RIGHT, tj. tabeli EmpSalary, zwrócił NULL odpowiadające tym rekordom. Ponieważ Lily, Sita, Farah i Jerry nie mają pasującego identyfikatora pracownika w tabeli EmpSalary, ich pensja jest wyświetlana jako NULL w zestawie wyników.

Więc, jeśli A i B są dwoma podmiotami, to lewe zewnętrzne złączenie zwróci zestaw wyników, który będzie równy „Rekordy w A NIE B”, w oparciu o pasujący klucz.

Teraz zaobserwujmy, co robi prawe zewnętrzne złączenie.

Query:

SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails RIGHT join EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Result:

.

EmployeeID EmployeeName EmployeeSalary
1 John 50000
2 Samantha 120000
3 Hakuna 75000
4 Silky 25000
5 Ram 150000
6 Arpit 80000
NULL NULL 90000
NULL 90000
NULL NULL 250000
NULL NULL 250000

W powyższym zbiorze wyników, można zauważyć, że Right Outer Join zrobił coś zupełnie odwrotnego niż lewe złączenie. Zwróciło wszystkie wynagrodzenia z prawej tabeli tj. tabeli EmpSalary.

Ale, ponieważ Rose, Sakshi i Jack nie mają pasującego ID pracownika w lewej tabeli tj. tabeli EmpDetails, otrzymaliśmy ich ID pracownika i EmployeeName jako NULL z lewej tabeli.

Więc, jeśli A i B są dwoma podmiotami, wtedy prawe zewnętrzne złączenie zwróci zestaw wyników, który będzie równy „Rekordy w B NIE A”, w oparciu o pasujący klucz.

Zobaczmy również, co będzie zestawem wyników, jeśli wykonujemy operację select na wszystkich kolumnach w obu tabelach.

Zapytanie:

SELECT *FROM EmpDetails RIGHT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Wynik:

.

.

.

.

.

EmployeeID EmployeeName EmployeeID EmployeeSalary
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

Teraz, przejdźmy do Full Join.

Pełne złączenie zewnętrzne jest wykonywane, gdy chcemy uzyskać wszystkie dane z obu tabel, niezależnie od tego, czy istnieje dopasowanie, czy nie. Stąd, jeśli chcę mieć wszystkich pracowników, nawet jeśli nie znajdę pasującego klucza, uruchomię zapytanie jak pokazano poniżej.

Kwerenda:

SELECT *FROM EmpDetails FULL JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;

Wynik:

.

.

.

.

EmployeeID EmployeeName EmployeeID EmployeeName EmployeeSalary
1 John 1 John 50000
2 Samantha 2 Samantha 120000
3 Hakuna 3 Hakuna 75000
4 Silky 4 Silky 25000
5 Ram 5 Ram 150000
6 Arpit 6 Arpit 80000
7 Lily NULL NULL NULL
8 Sita NULL NULL NULL
9 Farah NULL NULL NULL
10 Jerry NULL NULL NULL
NULL NULL
NULL NULL 11 Rose 90000
NULL NULL 12 Sakshi 250000
NULL NULL 13 Jack 250000

W powyższym zestawie wyników można zobaczyć, że jako pierwsze sześć rekordów są zgodne w obu tabelach, mamy wszystkie dane bez żadnych NULL. Kolejne cztery rekordy istnieją w lewej tabeli, ale nie w prawej, więc odpowiadające im dane w prawej tabeli mają wartość NULL.

Ostatnie trzy rekordy istnieją w prawej tabeli, ale nie w lewej, więc mamy NULL w odpowiadających im danych z lewej tabeli. Tak więc, jeśli A i B są dwoma podmiotami, pełne złączenie zewnętrzne zwróci zestaw wyników, który będzie równy „Rekordy w A I B”, niezależnie od pasującego klucza.

Teoretycznie jest to połączenie złączenia lewego i złączenia prawego.

Wydajność

Porównajmy złączenie wewnętrzne z lewym złączeniem zewnętrznym w serwerze SQL. Mówiąc o szybkości działania, złączenie zewnętrzne lewe nie jest oczywiście szybsze niż wewnętrzne.

Zgodnie z definicją, złączenie zewnętrzne, czy to lewe czy prawe, musi wykonać całą pracę złączenia wewnętrznego wraz z dodatkową pracą null-rozszerzającą wyniki. Oczekuje się, że złączenie zewnętrzne zwróci większą liczbę rekordów, co dodatkowo zwiększa jego całkowity czas wykonania tylko z powodu większego zestawu wyników.

Tak więc, złączenie zewnętrzne jest wolniejsze niż wewnętrzne.

Ponadto, mogą istnieć pewne specyficzne sytuacje, w których złączenie lewostronne będzie szybsze niż złączenie wewnętrzne, ale nie możemy dalej wymieniać ich ze sobą, ponieważ złączenie lewostronne nie jest funkcjonalnie równoważne złączeniu wewnętrznemu.

Przedyskutujmy przypadek, w którym złączenie lewostronne może być szybsze niż złączenie wewnętrzne. Jeśli tabele biorące udział w operacji złączenia są zbyt małe, powiedzmy mają mniej niż 10 rekordów i tabele nie posiadają wystarczających indeksów do pokrycia zapytania, w tym przypadku, Left Join jest generalnie szybsze niż Inner Join.

Utwórzmy dwie poniższe tabele i zróbmy INNER JOIN i LEFT OUTER JOIN między nimi jako przykład:

CREATE TABLE #Table1(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table1 (ID, Name) VALUES (1, 'A')INSERT #Table1 (ID, Name) VALUES (2, 'B')INSERT #Table1 (ID, Name) VALUES (3, 'C')INSERT #Table1 (ID, Name) VALUES (4, 'D')INSERT #Table1 (ID, Name) VALUES (5, 'E')CREATE TABLE #Table2(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table2 (ID, Name) VALUES (1, 'A')INSERT #Table2 (ID, Name) VALUES (2, 'B')INSERT #Table2 (ID, Name) VALUES (3, 'C')INSERT #Table2 (ID, Name) VALUES (4, 'D')INSERT #Table2 (ID, Name) VALUES (5, 'E')SELECT *FROM #Table1 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name
.

.

.

ID Nazwa ID Nazwa
1 1 A 1 A
2 2 B 2 2 B
3 3 C 3 C
4 4 D D 4 D
5 5 E 5 E
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);

.

.

ID Nazwa ID Nazwa
1 1 A 1 A
2 2 B 2 B
3 3 C 3 C
4 4 D 4 4 D
5 5 E 5 E

Jak widać powyżej, oba zapytania zwróciły ten sam zestaw wyników. W tym przypadku, jeśli przejrzysz plan wykonania obu zapytań, zauważysz, że złączenie wewnętrzne kosztowało więcej niż złączenie zewnętrzne. Dzieje się tak dlatego, że dla złączenia wewnętrznego serwer SQL wykonuje dopasowanie hash, podczas gdy dla złączenia lewego wykonuje zagnieżdżone pętle.

Zwykle dopasowanie hash jest szybsze niż zagnieżdżone pętle. Ale w tym przypadku, ponieważ liczba wierszy jest tak mała i nie ma indeksu do użycia (ponieważ wykonujemy złączenie na kolumnie nazwy), operacja haszowania okazała się najdroższym wewnętrznym zapytaniem złączenia.

Jednakże, jeśli zmienisz klucz dopasowania w zapytaniu złączenia z Nazwa na ID i jeśli istnieje duża liczba wierszy w tabeli, wtedy przekonasz się, że wewnętrzne złączenie będzie szybsze niż lewe zewnętrzne złączenie.

MS Access Inner and Outer Join

Kiedy używasz wielu źródeł danych w zapytaniu MS Access, wtedy stosujesz złączenia, aby kontrolować rekordy, które chcesz zobaczyć, w zależności od tego, jak źródła danych są połączone ze sobą.

W złączeniu wewnętrznym, tylko powiązane z obu tabel są łączone w jednym zestawie wyników. Jest to domyślne złączenie w Accessie i najczęściej używane. Jeśli zastosujesz złączenie, ale nie określisz jawnie typu złączenia, wtedy Access zakłada, że jest to złączenie wewnętrzne.

W złączeniach zewnętrznych, wszystkie powiązane dane z obu tabel są łączone poprawnie, plus wszystkie pozostałe wiersze z jednej tabeli. W pełnym złączeniu zewnętrznym wszystkie dane są łączone, gdzie tylko jest to możliwe.

Left Join vs Left Outer Join

W SQL server, słowo kluczowe outer jest opcjonalne, gdy stosujesz left outer join. Dlatego nie ma różnicy, czy napiszesz 'LEFT OUTER JOIN’ czy 'LEFT JOIN’, ponieważ oba dadzą ten sam wynik.

A LEFT JOIN B jest równoważną składnią do A LEFT OUTER JOIN B.

Poniżej znajduje się lista składni równoważnych w serwerze SQL:

składnie równoważne w serwerze SQL

Left Outer Join vs Right Outer Join

Widzieliśmy już tę różnicę w tym artykule. Możesz odnieść się do zapytań Left Outer Join i Right Outer Join oraz zestawu wyników, aby zobaczyć różnicę.

Główna różnica pomiędzy Left Join i Right Join leży w uwzględnieniu niedopasowanych wierszy. Lewe złączenie zewnętrzne zawiera niedopasowane wiersze z tabeli, która jest po lewej stronie klauzuli złączenia, podczas gdy prawe złączenie zewnętrzne zawiera niedopasowane wiersze z tabeli, która jest po prawej stronie klauzuli złączenia.

Ludzie pytają, które jest lepsze do użycia tj. Zasadniczo są to operacje tego samego typu z wyjątkiem odwrócenia ich argumentów. Stąd, kiedy pytasz, którego złączenia użyć, tak naprawdę pytasz, czy napisać a<b czy b>a. Jest to tylko kwestia preferencji.

Generalnie, ludzie wolą używać złączenia lewego w swoich zapytaniach SQL. Sugerowałbym, abyś pozostał konsekwentny w sposobie, w jaki piszesz zapytanie, aby uniknąć zamieszania w interpretacji zapytania.

Widzieliśmy już wszystko o złączeniu wewnętrznym i wszystkich typach złączenia zewnętrznego. Podsumujmy szybko różnicę między Inner Join i Outer Join.

Różnica między Inner Join i Outer Join w formacie tabelarycznym

Inner Join Outer Join
Przywraca tylko wiersze, które mają pasujące wartości w obu tabelach. Zawiera pasujące wiersze, jak również niektóre z niedopasowanych wierszy między dwoma tabelami.
W przypadku, gdy istnieje duża liczba wierszy w tabelach i istnieje indeks do użycia, INNER JOIN jest generalnie szybsze niż OUTER JOIN. Generalnie, OUTER JOIN jest wolniejsze niż INNER JOIN, ponieważ musi zwrócić więcej rekordów w porównaniu do INNER JOIN. Jednak mogą istnieć pewne szczególne scenariusze, w których OUTER JOIN jest szybszy.
Gdy dopasowanie nie zostanie znalezione, nie zwraca niczego. Gdy dopasowanie nie zostanie znalezione, NULL jest umieszczany w wartości zwracanej kolumny.
Użyj INNER JOIN, gdy chcesz sprawdzić szczegółowe informacje dotyczące dowolnej konkretnej kolumny. Użyj OUTER JOIN, gdy chcesz wyświetlić listę wszystkich informacji w dwóch tabelach.
INNER JOIN działa jak filtr. Musi istnieć dopasowanie w obu tabelach, aby złączenie wewnętrzne zwróciło dane. Działają one jak dane-add ons.
Implicit join notation istnieje dla złączenia wewnętrznego, które zawiera tabele, które mają być połączone w sposób oddzielony przecinkami w klauzuli FROM.
Przykład: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID;
Nie istnieje notacja złączenia niejawnego dla złączenia zewnętrznego.
Poniżej jest wizualizacja złączenia wewnętrznego:
wizualizacja złączenia wewnętrznego
Poniżej znajduje się wizualizacja złączenia zewnętrznego
wizualizacja złączenia zewnętrznego

Inner and Outer Join vs Union

Czasami mylimy Join i Union i jest to również jedno z najczęściej zadawanych pytań podczas wywiadów SQL. Widzieliśmy już różnicę pomiędzy wewnętrznym złączeniem a zewnętrznym złączeniem. Teraz zobaczmy, czym różni się JOIN od UNION.

UNION umieszcza linię zapytań po sobie, podczas gdy join tworzy iloczyn kartezjański i podporządkowuje go. Zatem UNION i JOIN są zupełnie innymi operacjami.

Wprowadźmy dwa poniższe zapytania w MySQL i zobaczmy ich wynik.

UNION Zapytanie:

SELECT 28 AS bahUNIONSELECT 35 AS bah;

Wynik:

Bah
1 28
2 35

JOIN Query:

SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (55=55);

Result:

.

foo Bar
1 38 35

Operacja UNION składa wynik dwóch lub więcej zapytań w jeden zestaw wyników. Ten zestaw wyników zawiera wszystkie rekordy, które zostały zwrócone przez wszystkie zapytania biorące udział w operacji UNION. Tak więc, zasadniczo, UNION łączy dwa zestawy wyników razem.

Operacja join pobiera dane z dwóch lub więcej tabel w oparciu o logiczne relacje pomiędzy tymi tabelami, tj. w oparciu o warunek join. W zapytaniu join, dane z jednej tabeli są używane do wyboru rekordów z innej tabeli. Pozwala to na połączenie podobnych danych, które są obecne w różnych tabelach.

Aby zrozumieć to bardzo prosto, można powiedzieć, że UNION łączy wiersze z dwóch tabel, podczas gdy join łączy kolumny z dwóch lub więcej tabel. Tak więc, oba są używane do łączenia danych z n tabel, ale różnica tkwi w sposobie łączenia danych.

Poniżej znajdują się obrazowe reprezentacje UNION i JOIN.

UNION i JOIN1

Powyżej znajduje się obrazowa reprezentacja operacji złączenia przedstawiająca, że każdy rekord w zbiorze wyników zawiera kolumny z obu tabel, tj. tabeli A i tabeli B. Wynik ten jest zwracany na podstawie warunku złączenia zastosowanego w zapytaniu.

Złączenie jest ogólnie wynikiem denormalizacji (przeciwieństwo normalizacji) i używa klucza obcego jednej tabeli do wyszukiwania wartości kolumn przez zastosowanie klucza głównego w innej tabeli.

UNION i JOIN2

Powyżej znajduje się obrazowa reprezentacja operacji UNION przedstawiająca, że każdy rekord w zestawie wyników jest wierszem z jednej z dwóch tabel. Tak więc, wynik UNION połączył wiersze z tabeli A i tabeli B.

Dalsza lektura =>> MySQL UNION wyjaśnione z przykładami

Zakończenie

W tym artykule, widzieliśmy główne różnice pomiędzy Inner Join i Outer Join w SQL. Zobaczyliśmy również klasyfikację złączenia zewnętrznego tj. złączenie lewe, złączenie prawe oraz złączenie pełne. Widzieliśmy jak każdy z tych typów złączeń działa i jak różnią się one od siebie.

Wykonaliśmy również porównanie wydajności pomiędzy tymi typami złączeń. Omówiliśmy również jak złączenie różni się od unii.

Przeczytaj również =>> MySQL Join Types

Mamy nadzieję, że ten artykuł pomógłby Ci w rozwianiu wątpliwości dotyczących różnic pomiędzy różnymi typami złączenia. Jesteśmy pewni, że dzięki temu będziesz w stanie zdecydować, który typ złączenia wybrać w oparciu o pożądany zestaw wyników.