Jaka jest różnica między "złączem wewnętrznym" a "złączem zewnętrznym"?
Również jak LEFT JOIN
, RIGHT JOIN
i FULL JOIN
pasuje?
30 answers
Zakładając, że łączysz się na kolumnach bez duplikatów, co jest bardzo częstym przypadkiem:
Połączenie wewnętrzne A i B daje wynik przecięcia B, czyli wewnętrznej części diagramu Venna przecięcia.
Zewnętrzne połączenie A i B daje wyniki Unii B, tj. zewnętrznych części Unii diagramu Venna.
Przykłady
Załóżmy, że masz dwie tabele, z jedną kolumną każda, a dane jako "follows": {]}
A B
- -
1 3
2 4
3 5
4 6
Zauważ, że (1,2) są unikalne dla A, (3,4) są powszechne, a (5,6) są unikalne dla B.
Połączenie wewnętrzne
Połączenie wewnętrzne przy użyciu jednego z równoważnych zapytań daje przecięcie dwóch tabel, tzn. dwóch wierszy, które mają ze sobą wspólnego.
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
Left outer join
Lewy zewnętrzny łącznik da 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
Złącze ZEWNĘTRZNE PRAWE
Prawe złącze zewnętrzne da wszystkie wiersze w B plus wszystkie wiersze wspólne 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łącze zewnętrzne
Pełne zewnętrzne połączenie da ci połączenie A i B, tzn. wszystkie wiersze w A i wszystkie wiersze w B. Jeśli coś w A nie ma odpowiedniego punktu odniesienia w B, to część B jest null i odwrotnie.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 19:52:04
Możesz również rozważyć następujący schemat dla różnych typów połączeń;
Źródło: Visual-Representation-of-SQL-Joins wyjaśnione szczegółowo przez C. L. Moffatt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 14:12:27
Polecam Jeff ' s blog article . Najlepszy opis jaki widziałem, plus jest wizualizacja, np.:
Połączenie Wewnętrzne:
Pełne Połączenie Zewnętrzne:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 20:15:36
Diagramy Venna nie robią tego za mnie.
Nie wykazują rozróżnienia między łączeniem krzyżowym a łączeniem wewnętrznym, na przykład, lub bardziej ogólnie pokazują rozróżnienie między różnymi typami predykatu łącznika lub zapewniają ramy do rozumowania o tym, jak będą działać.
Nie ma substytutu dla zrozumienia logicznego przetwarzania i jest to stosunkowo proste do zrozumienia i tak.
- wyobraź sobie połączenie krzyżowe.
- Oceń
on
klauzula przed wszystkimi wierszami z kroku 1, zachowując te, w których predykat ocenia się natrue
- (tylko dla złączeń zewnętrznych) Dodaj z powrotem w dowolnych zewnętrznych wierszach, które zostały utracone w Kroku 2.
(uwaga: w praktyce optymalizator zapytań może znaleźć bardziej efektywne sposoby wykonania zapytania niż opis czysto logiczny powyżej, ale wynik końcowy musi być taki sam)
Zacznę od animowanej wersji full outer join . Dalsze wyjaśnienie / align = "left" /
Wyjaśnienie
Tabele Źródłowe
Pierwszy początek CROSS JOIN
(Aka iloczyn kartezjański). Nie ma klauzuli ON
i po prostu zwraca każdą kombinację wierszy z dwóch tabel.
Wybierz A. Kolor, B. Kolor z łącznika krzyżowego B
Połączenia wewnętrzne i zewnętrzne mają predykat klauzuli "ON".
- Inner Join. Oblicz warunek w klauzuli " ON " dla wszystkich wierszy w wyniku połączenia krzyżowego. If true zwraca połączony wiersz. W przeciwnym razie należy go wyrzucić.
- / Align = "Left" / to samo co INNER join, wtedy dla dowolnych wierszy w lewej tabeli, które nie pasują do niczego, wyprowadza je z wartościami NULL dla prawej kolumny tabeli.
- Prawy Zewnętrzny Łącznik. tak samo jak Inner join wtedy dla dowolnych wierszy w prawej tabeli, które nie pasują do niczego, wyprowadzaj te z wartościami NULL dla lewej tabeli kolumny.
- Pełne Połączenie Zewnętrzne. tak samo jak wewnętrzne połączenie, a następnie zachowaj lewe niepasujące wiersze, jak w lewym zewnętrznym połączeniu i prawym niepasującym wierszu, jak w prawym zewnętrznym połączeniu.
Niektóre przykłady
Wybierz A. Kolor, B. Kolor Z połączenia wewnętrznego B NA A. Kolor = B. Kolor
Powyższe jest klasycznym połączeniem equi.
Wersja Animowana
Wybierz A. Kolor, B. Kolor Z połączenia wewnętrznego B NA A. Kolor Nie w ('zielony','niebieski')
Wewnętrzny warunek join niekoniecznie musi być warunkiem równości i nie musi odwoływać się do kolumn z obu (lub nawet obu) tabel. Ewaluacja A.Colour NOT IN ('Green','Blue')
w każdym wierszu krzyża join zwraca.
Wybierz A. Kolor, B. Kolor Z połączenia wewnętrznego B na 1 =1
Warunek join jest obliczany na true dla wszystkich wierszy w wyniku połączenia krzyżowego, więc jest to takie samo jak połączenie krzyżowe. Nie będę powtarzał obraz z 16 rzędów ponownie.
Wybierz A. Kolor, B. Kolor Z Lewej strony złącz B NA A. Kolor = B. Kolor
Złączenia zewnętrzne są logicznie obliczane tak samo jak złączenia wewnętrzne, z tym wyjątkiem, że jeśli wiersz z lewej tabeli (dla złączenia lewego) nie łączy się z żadnymi wierszami z prawej tabeli, to jest zachowywany w wyniku z wartościami NULL
dla kolumn z prawej strony.
SELECT A. Colour, B. Colour FROM a LEFT OUTER JOIN B ON A. Colour = B. Kolor, gdzie B. Kolor jest NULL
To po prostu ogranicza poprzedni wynik do zwracania tylko wierszy gdzie B.Colour IS NULL
. W tym konkretnym przypadku będą to wiersze, które zostały zachowane, ponieważ nie miały dopasowania w tabeli po prawej stronie, a zapytanie zwraca Pojedynczy Czerwony wiersz nie dopasowany w tabeli B
. Jest to znane jako anty pół join.
Ważne jest, aby wybrać kolumnę dla testu IS NULL
, która nie jest nullable lub dla której warunek join zapewnia, że dowolne wartości NULL
zostanie wykluczone, aby ten wzór działał poprawnie i uniknie przywracania wierszy, które mają wartość NULL
dla tej kolumny oprócz dopasowanych wierszy.
Wybierz A. Kolor, B. Kolor Z prawej strony zewnętrznej połącz B NA A. Kolor = B. Kolor
Prawe złączenia zewnętrzne działają podobnie do lewych złączeń zewnętrznych, z wyjątkiem tego, że zachowują niepasujące wiersze z prawej tabeli, a null rozszerza kolumny lewej ręki.
Wybierz A. Colour, B. Colour FROM a FULL OUTER JOIN B ON A. Colour = B. Colour
Pełne złączenia zewnętrzne łączą zachowanie lewego i prawego złączenia i zachowują niepasujące wiersze z lewej i prawej tabeli.
SELECT A. Colour, B. Colour FROM a FULL OUTER JOIN B ON 1 = 0
Żadne wiersze w łączniku krzyżowym nie pasują do predykatu 1=0
. Wszystkie wiersze z obu stron są zachowywane przy użyciu zwykłych reguł zewnętrznych z NULL w kolumnach z tabeli na z drugiej strony.
SELECT COALESCE (A. Colour, B. Colour) AS Colour FROM a FULL OUTER JOIN B ON 1 = 0
Z drobną poprawką do poprzedniego zapytania można symulować UNION ALL
z dwóch tabel.
Wybierz A. Kolor, B. Kolor Z Lewej strony złącz B NA A. Kolor = B. Kolor gdzie B. Kolor = 'Zielony'
Zauważ, że klauzula WHERE
(jeśli istnieje) logicznie działa po połączeniu. Jednym z najczęstszych błędów jest wykonanie lewego połączenia zewnętrznego a następnie dołącz klauzulę WHERE z warunkiem na prawej tabeli, która kończy się wykluczeniem niepasujących wierszy. Powyższe kończy się wykonaniem połączenia zewnętrznego...
... I wtedy działa klauzula "gdzie". NULL= 'Green'
nie ocenia na true, więc wiersz zachowany przez zewnętrzne złącze zostaje odrzucony (wraz z Niebieskim) skutecznie konwertując złącze z powrotem na wewnętrzne.
Jeśli intencją było włączenie tylko wierszy z B, gdzie kolor jest zielone i wszystkie wiersze z A niezależnie od poprawnej składni będą
Wybierz A. Kolor, B. Kolor Z Lewej strony złącze B NA A. Kolor = B. Kolor I B. Kolor = 'Zielony'
SQL Fiddle
Zobacz te przykłady uruchom na żywo w SQLFiddle.com .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 07:59:59
Poniższy artykuł został zaczerpnięty z artykułu" MySQL - LEFT JOIN and RIGHT JOIN, INNER JOIN and OUTER JOIN "Grahama Ellisa na swoim blogu horse' s Mouth.
W bazie danych, takiej jak MySQL, dane są podzielone na kilka tabel, które są następnie połączone (Joined
) razem za pomocą JOIN
w poleceniach SELECT
do odczytu rekordów z wielu tabel. Przeczytaj ten przykład, aby zobaczyć, jak to działa.
Po pierwsze, niektóre przykładowe dane:
people
mysql> select * from people;
+------------+--------------+------+
| name | phone | pid |
+------------+--------------+------+
| Mr Brown | 01225 708225 | 1 |
| Miss Smith | 01225 899360 | 2 |
| Mr Pullen | 01380 724040 | 3 |
+------------+--------------+------+
3 rows in set (0.00 sec)
property
mysql> select * from property;
+------+------+----------------------+
| pid | spid | selling |
+------+------+----------------------+
| 1 | 1 | Old House Farm |
| 3 | 2 | The Willows |
| 3 | 3 | Tall Trees |
| 3 | 4 | The Melksham Florist |
| 4 | 5 | Dun Roamin |
+------+------+----------------------+
5 rows in set (0.00 sec)
ZWYKŁE POŁĄCZENIE
Jeśli zrobimy regularne JOIN( bez żadnego ze słów kluczowych INNER, OUTER, LEFT lub RIGHT), wtedy otrzymujemy wszystkie rekordy, które pasują w odpowiedni sposób w dwóch tabelach, A rekordy w obu przychodzących tabelach, które nie pasują, nie są zgłaszane:
mysql> select name, phone, selling
from people join property
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)
LEFT JOIN
Jeśli wykonamy lewe połączenie, otrzymamy wszystkie rekordy, które pasują do siebie w ten sam sposób, a dodatkowo otrzymamy dodatkowy rekord dla każdego niezrównanego rekordu w lewej tabeli połączenia-zapewniając w ten sposób (w tym przykładzie), że każda osoba otrzyma wzmianka:
mysql> select name, phone, selling
from people left join property
on people.pid = property.pid;
+------------+--------------+----------------------+
| name | phone | selling |
+------------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Miss Smith | 01225 899360 | NULL <<-- unmatch |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+------------+--------------+----------------------+
5 rows in set (0.00 sec)
RIGHT JOIN
Jeśli wykonamy poprawne JOIN, otrzymamy wszystkie rekordy, które pasują, a dodatkowo dodatkowy rekord dla każdego niezrównanego rekordu w prawej tabeli join - w moim przykładzie oznacza to, że każda właściwość dostaje wzmiankę, nawet jeśli nie mamy danych sprzedającego:
mysql> select name, phone, selling
from people right join property
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL | NULL | Dun Roamin |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)
INNER JOIN wykonuje pełne join, tak jak w pierwszym przykładzie, a słowo OUTER może być dodane po słowie w lewo lub w prawo w dwóch ostatnich przykładach - jest przewidziane dla Kompatybilność ODBC i nie dodaje dodatkowych możliwości.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 11:21:45
Joins są używane do łączenia danych z dwóch tabel, w wyniku czego powstaje nowa, tymczasowa tabela. Połączenia są wykonywane na podstawie czegoś, co nazywa się predykatem, który określa warunek, którego należy użyć w celu wykonania połączenia. Różnica między łącznikiem wewnętrznym a łącznikiem zewnętrznym polega na tym, że łącznik wewnętrzny zwróci tylko wiersze, które rzeczywiście pasują do predykatu łącznika. Lets consider Employee and Location table:
Inner Dołącz:- INNER join tworzy nową tabelę wyników, łącząc wartości kolumn z dwóch tabel ( Employee i Location ) w oparciu o predykat join. Zapytanie porównuje każdy wiersz Employee z każdym wierszem Location, aby znaleźć wszystkie pary wierszy, które spełniają predykat join. Gdy predykat join jest spełniony przez dopasowanie wartości innych niż NULL, wartości kolumn dla każdej dopasowanej pary wierszy Employee i Location są połączone w wierszu wynikowym. Oto jak będzie wyglądał SQL dla połączenia wewnętrznego:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
Oto jak wyglądałby wynik uruchomienia tego SQL ' a:
Złącze Zewnętrzne: - Połączenie zewnętrzne nie wymaga, aby każdy rekord w dwóch połączonych tabelach miał pasujący rekord. Połączona tabela zachowuje każdy rekord-nawet jeśli nie istnieje żaden inny pasujący rekord. Połączenia zewnętrzne dzielą się dalej na połączenia ZEWNĘTRZNE LEWE I ZEWNĘTRZNE PRAWE, w zależności od wierszy tabeli są zachowane (w lewo lub w prawo).
Left Outer Join:- Wynik połączenia left outer join (lub po prostu left join) dla tabel Employee i Location zawsze zawiera wszystkie rekordy tabeli" left " (Employee ), nawet jeśli warunek join nie znajduje żadnego pasującego rekordu w tabeli "right" ( Location). Oto, jak wyglądałby SQL dla lewego zewnętrznego połączenia, używając powyższych tabel:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Oto, co wynik uruchomienia tego SQL ' a wyglądałby następująco:
Prawe Złącze Zewnętrzne:- Prawe złącze zewnętrzne (lub prawe złącze) bardzo przypomina lewe złącze zewnętrzne, z wyjątkiem traktowania tabel odwróconych. Każdy wiersz z" prawej " tabeli (Location ) pojawi się w połączonej tabeli co najmniej raz. Jeśli nie ma pasującego wiersza z tabeli" left " (Employee ), NULL pojawi się w kolumnach z Employee dla tych rekordów, które nie ma dopasowania w miejscu . Tak wygląda SQL:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Korzystając z powyższych tabel, możemy pokazać, jak wyglądałby zestaw wynikowy prawego złączenia zewnętrznego:
Pełne Połączenia Zewnętrzne: - Pełne złącze zewnętrzne lub Pełne złącze ma na celu zachowanie informacji niepasujących, włączając niepasujące wiersze w wynikach połączenia, użyj pełnego złącza zewnętrznego. Obejmuje wszystkie wiersze z obu tabel, niezależnie od tego, czy druga tabela ma pasująca wartość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 14:38:49
Inner Join
Pobiera tylko dopasowane wiersze, czyli A intersect B
.
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Left Outer Join
Wybierz wszystkie rekordy z pierwszej tabeli i wszystkie rekordy z drugiej stół pasujący do połączonych kluczy.
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Pełne Połączenie Zewnętrzne
Wybierz wszystkie rekordy z drugiej tabeli i wszystkie rekordy z pierwszej tabela pasująca do łączonych klucze.
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
Referencje
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 15:38:32
W prostych słowach:
An inner join pobiera tylko dopasowane wiersze.
Natomiast zewnętrzne połączenie pobiera dopasowane wiersze z jednej tabeli i wszystkie wiersze z drugiej tabeli ....wynik zależy od tego, którego z nich używasz:
-
Left : dopasowane wiersze w prawej tabeli i wszystkie wiersze w lewej tabeli
Right: dopasowane wiersze w lewej tabeli i wszystkie wiersze w prawej tabeli lub
-
Full : wszystkie wiersze we wszystkich tabelach. Nie ma znaczenia czy jest dopasowanie czy nie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 15:35:37
Złącze wewnętrzne pokazuje wiersze tylko wtedy, gdy po drugiej (prawej) stronie złącza znajduje się pasujący rekord.
A (lewy) zewnętrzny łącznik pokazuje wiersze dla każdego rekordu po lewej stronie, nawet jeśli nie ma pasujących wierszy po drugiej (prawej) stronie łącznika. Jeśli nie ma pasującego wiersza, kolumny dla drugiej (prawej) strony będą pokazywały null.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 01:14:26
Połączenia wewnętrzne wymagają, aby w połączonej tabeli istniał rekord o powiązanym identyfikatorze.
Zewnętrzne połączenia zwrócą rekordy dla lewej strony, nawet jeśli dla prawej nie istnieje nic.
Na przykład, masz tabelę Orderdetails i Orderdetails. Są one związane przez "OrderID"
Zamówienia
- OrderID
- nazwa użytkownika
OrderDetails
- OrderDetailID
- OrderID
- Nazwa produktu
- Qty
- cena
Żądanie
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
Zwróci tylko zamówienia, które również mają coś w tabeli OrderDetails.
Jeśli zmienisz go na Outer LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
Wtedy zwróci rekordy z tabeli Orders nawet jeśli nie ma żadnych zapisów OrderDetails.
Możesz użyć tego, aby znaleźć zamówienia, które nie mają żadnych OrderDetails wskazujących możliwe osierocone zamówienie, dodając klauzulę where, taką jak WHERE OrderDetails.OrderID IS NULL
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 08:25:51
W prostych słowach:
INNER join - > pobiera tylko wspólne rekordy z tabel nadrzędnych i podrzędnych, gdzie klucz podstawowy tabeli nadrzędnej pasuje do klucza obcego w tabeli podrzędnej.
/ align = "Left" / ->
Pseudo kod
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
Right join : dokładnie odwrotnie niż left join . Umieść nazwę tabeli w lewym łączniku po prawej stronie w prawym łączniku, otrzymasz takie same wyniki jak w lewym łączniku.
Outer join : pokazuje wszystkie rekordy w obu tabelach No matter what
. Jeśli rekordy w lewej tabeli nie pasują do prawej tabeli bazującej na głównym kluczu Forieign, użyj wartości NULL jako wyniku join .
Przykład:
Załóżmy teraz dla 2 tabel
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
Tutaj tabela pracowników jest tabelą nadrzędną, phone_numbers_employees jest tabelą podrzędną (zawiera emp_id
jako klucz obcy, który łączy employee.id
, a więc jego tabelę podrzędną.)
Połączenia wewnętrzne
Weź rekordy 2 tabel tylko wtedy, gdy klucz podstawowy tabeli pracowników (jej id) pasuje do klucza obcego tabeli podrzędnej phone_numbers_employees (emp_id) .
Więc zapytanie będzie:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Tutaj weź tylko pasujące wiersze na klucz podstawowy = klucz obcy, jak wyjaśniono powyżej.Tutaj niepasujące wiersze na klucz główny = klucz obcy są pomijane jako wynik połączenia.
Lewy joined :
LEFT join zachowuje wszystkie wiersze lewej tabeli, niezależnie od tego, czy wiersz pasuje do prawej stolik.
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Złącza zewnętrzne :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
Diagramatycznie wygląda to tak:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 05:11:56
Używasz INNER JOIN
aby zwrócić wszystkie wiersze z obu tabel, w których występuje dopasowanie. tzn. w wynikowej tabeli wszystkie wiersze i kolumny będą miały wartości.
W OUTER JOIN
wynikowa tabela może mieć puste kolumny. Złącze zewnętrzne może być LEFT
lub RIGHT
.
LEFT OUTER JOIN
zwraca wszystkie wiersze z pierwszej tabeli, nawet jeśli w drugiej tabeli nie ma dopasowań.
RIGHT OUTER JOIN
zwraca wszystkie wiersze z drugiej tabeli, nawet jeśli nie ma dopasowań w pierwszej tabeli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 03:21:07
Jest to dobre diagramatyczne Wyjaśnienie dla wszelkiego rodzaju połączeń
Źródło: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 18:48:59
INNER JOIN
wymaga jest co najmniej mecz w porównaniu dwóch tabel. Na przykład tabela A I Tabela B, która implikuje a ٨ B (przecięcie B).
LEFT OUTER JOIN
i LEFT JOIN
są takie same. Daje wszystkie rekordy pasujące w obu tabelach i wszystkie możliwości lewej tabeli.
Podobnie, RIGHT OUTER JOIN
i RIGHT JOIN
są takie same. Daje wszystkie rekordy pasujące do obu tabel i wszystkie możliwości odpowiedniej tabeli.
FULL JOIN
jest połączeniem LEFT OUTER JOIN
i RIGHT OUTER JOIN
bez duplikacja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 21:25:28
Odpowiedź jest w znaczeniu każdego z nich, więc w wynikach.
Uwaga:
WSQLite
nie maRIGHT OUTER JOIN
aniFULL OUTER JOIN
.
A także wMySQL
nie maFULL OUTER JOIN
.
Moja odpowiedź opiera się na powyższej notce.
Gdy masz dwie tabele takie jak te:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
POŁĄCZENIE KRZYŻOWE / ZEWNĘTRZNE:
Możesz mieć wszystkie te tabele z CROSS JOIN
lub po prostu z ,
Jak to:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
POŁĄCZENIE WEWNĘTRZNE:
Jeśli chcesz dodać filtr do powyższych wyników w oparciu o relację table1.id = table2.id
możesz użyć INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
LEFT [OUTER] JOIN:
Jeśli chcesz mieć wszystkie wiersze jednej z tabel w powyższym wyniku - z tą samą relacją - możesz użyć LEFT JOIN
:
(For RIGHT JOIN just change place of tables)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
PEŁNE POŁĄCZENIE ZEWNĘTRZNE:
Gdy chcesz również mieć wszystkie wiersze z drugiej tabeli w wynikach można użyć FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
Cóż, jako swoje potrzeby wybierasz każdą, która pokrywa twoje potrzeby ;).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 08:50:33
Różnica polega na sposobie łączenia tabel, jeśli nie ma wspólnych rekordów.
-
JOIN
jest taka sama jak {[2] } i oznacza wyświetlanie tylko rekordów wspólnych dla obu tabel. To, czy rekordy są wspólne, zależy od pól w klauzuli join. Na przykład:FROM t1 JOIN t2 on t1.ID = t2.ID
Oznacza wyświetlanie tylko rekordów, w których w obu tabelach istnieje ta sama wartość
ID
. LEFT JOIN
jest taka sama jakLEFT OUTER JOIN
i oznacza wyświetlenie wszystkich rekordów z lewej tabeli (tj. tej, która poprzedza w SQL statement) niezależnie od istnienia pasujących rekordów w odpowiedniej tabeli.-
RIGHT JOIN
jest tym samym coRIGHT OUTER JOIN
i oznacza przeciwieństwoLEFT JOIN
, tzn. pokazuje wszystkie rekordy z drugiej (prawej) tabeli i tylko pasujące rekordy z pierwszej (lewej) tabeli.
Źródło: Jaka jest różnica między lewą, prawą, wewnętrzną, zewnętrzną, połączoną?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 07:33:10
Połączenie wewnętrzne.
Join jest połączeniem wierszy z dwóch tabel. Połączenie wewnętrzne próbuje dopasować dwie tabele na podstawie kryteriów podanych w zapytaniu i zwraca tylko te wiersze, które pasują. Jeśli wiersz z pierwszej tabeli w join pasuje do dwóch wierszy w drugiej tabeli, wtedy w wynikach zostaną zwrócone dwa wiersze. Jeśli w pierwszej tabeli znajduje się wiersz, który nie pasuje do wiersza w drugiej, nie jest zwracany; podobnie, jeśli w drugiej jest wiersz tabela, która nie pasuje do pierwszego rzędu, nie jest zwracana.
Zewnętrzne Połączenie.
A left join próbuje znaleźć dopasowanie wierszy z pierwszej tabeli do wierszy z drugiej tabeli. Jeśli nie może znaleźć dopasowania, zwróci kolumny z pierwszej tabeli i pozostawi kolumny z drugiej tabeli puste (null).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 11:14:00
Nie widzę wiele szczegółów na temat wydajności i optymalizacji w innych odpowiedziach.
Czasami dobrze jest wiedzieć, że tylko INNER JOIN
jest asocjacyjny, co oznacza, że optymalizator ma najwięcej opcji do zabawy. Może zmienić kolejność połączeń, aby szybciej utrzymać ten sam wynik. Optymalizator może korzystać z większości trybów łączenia.
Ogólnie dobrą praktyką jest używanie INNER JOIN
zamiast różnego rodzaju połączeń. (Oczywiście jeśli jest to możliwe biorąc pod uwagę oczekiwane wynik ustawiony.)
Jest tu kilka dobrych przykładów i wyjaśnień na temat tego dziwnego asocjacyjnego zachowania:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:48
Różnica polega na sposobie łączenia tabel, jeśli nie ma wspólnych rekordów.
JOIN
jest taka sama jak {[2] } i oznacza wyświetlanie tylko rekordów wspólnych dla obu tabel. To, czy rekordy są wspólne, zależy od pól w klauzuli join.
Na przykład:
SELECT *
FROM t1
JOIN t2 on t1.ID = t2.ID
Oznacza wyświetlanie tylko rekordów, w których w obu tabelach istnieje ta sama wartość ID
.
LEFT JOIN
jest taki sam jak LEFT OUTER JOIN
i oznacza wyświetlenie wszystkich rekordów z lewej tabeli (tzn. tej, która poprzedza w poleceniu SQL) niezależnie od istnienia pasujących rekordów w prawej tabeli.
RIGHT JOIN
jest taka sama jak RIGHT OUTER JOIN
i oznacza przeciwieństwo LEFT JOIN
, tzn. pokazuje wszystkie rekordy z drugiej (prawej) tabeli i tylko pasujące rekordy z pierwszej (lewej) tabeli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 04:41:04
Skrytykowawszy uwielbiany czerwony diagram Venna, uznałem, że słuszne jest opublikowanie własnej próby.
Chociaż odpowiedź @ Martin Smith jest najlepsza z tej grupy przez długi czas, jego tylko pokazuje kolumnę klucza z każdej tabeli, podczas gdy myślę, że najlepiej kolumny bez klucza powinny być pokazane.
Najlepsze co mogłem zrobić w ciągu pół godziny, nadal uważam, że nie pokazuje to odpowiednio, że null są tam z powodu braku kluczowych wartości w TableB
lub że {[1] } jest rzeczywiście Unią zamiast łącznika:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 15:23:20
Precyzyjny algorytm dla INNER JOIN
, LEFT/RIGHT OUTER JOIN
są następujące:
- weź każdy wiersz z pierwszej tabeli:
a
- rozważmy wszystkie wiersze z drugiej tabeli obok:
(a, b[i])
- Oceń klauzulę
ON ...
dla każdej pary:ON( a, b[i] ) = true/false?
- gdy warunek zostanie obliczony na
true
, zwróć ten połączony wiersz(a, b[i])
. - gdy osiągniesz koniec drugiej tabeli bez dopasowania, a jest to
Outer Join
, zwróć (virtual) parę używającNull
dla wszystkich kolumn inne tabele:(a, Null)
dla lewego złączenia zewnętrznego lub {[11] } dla prawego złączenia zewnętrznego. Ma to na celu zapewnienie istnienia wszystkich wierszy pierwszej tabeli w wynikach końcowych.
- gdy warunek zostanie obliczony na
Uwaga: warunek określony w klauzuli ON
może być dowolny, nie jest wymagane używanie kluczy podstawowych (i nie musisz zawsze odwoływać się do kolumn z obu tabel)! Na przykład:
-
... ON T1.title = T2.title AND T1.version < T2.version
(=>zobacz ten post jako przykładowe użycie: wybierz tylko wiersze z maksymalną wartością na kolumna ) ... ON T1.y IS NULL
-
... ON 1 = 0
(tylko jako próbka)
Uwaga: Left Join = Left Outer Join, Right Join = Right Outer Join.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 14:16:16
Inner Join INNER join skupia się na podobieństwie między dwoma stołami. Podczas korzystania z połączenia wewnętrznego, muszą istnieć co najmniej pewne pasujące dane między dwoma (lub więcej) tabelami, które są porównywane. Połączenie wewnętrzne przeszukuje tabele w poszukiwaniu pasujących lub nakładających się danych. Po znalezieniu, połączenie wewnętrzne łączy i zwraca informacje w jednej nowej tabeli.
Złącze Zewnętrzne Zewnętrzne złącze zwraca zestaw rekordów (lub wierszy), które zawierają to, co wewnętrzne złącze zwróci, ale także zawierają inne wiersze, dla których w drugiej tabeli nie znaleziono odpowiedniego dopasowania.
Istnieją trzy rodzaje złączy zewnętrznych:
Left Outer Join (lub Left Join) Right Outer Join (lub Right Join) Pełne połączenie zewnętrzne (lub pełne połączenie) Każde z tych zewnętrznych złączeń odnosi się do części danych, które są porównywane, łączone i zwracane. Czasami null będą tworzone w tym procesie, ponieważ niektóre dane są współdzielone, a inne nie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 10:53:13
Najprostsze Definicje
Inner Join: zwraca dopasowane rekordy z obu tabel.
Full Outer Join: zwraca dopasowane i niepasowane rekordy z obu tabel z null dla niepasowanych rekordów z obu tabel.
Left Outer Join: zwraca dopasowane i niedopasowane rekordy tylko z tabeli Left Side .
Right Outer Join: zwraca dopasowane i niedopasowane rekordy tylko z tabeli na Right Strona .
In-Short
Dopasowane + Lewy Niezrównany + Prawy Niezrównany = Pełne Zewnętrzne Połączenie
Dopasowany + Lewy Niezrównany = Lewy Zewnętrzny Join
Dopasowany + Prawy Niezrównany = Prawy Zewnętrzny Łącznik
Matched = Inner Join
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 09:10:48
POŁĄCZENIE WEWNĘTRZNE
Połączenie wewnętrzne tworzy zestaw wyników, który jest ograniczony do wierszy, w których istnieje dopasowanie w obu tabelach dla tego, czego szukamy. Jeśli nie wiesz, jakiego rodzaju dołączyć trzeba, to zazwyczaj będzie najlepszym rozwiązaniem.
LEFT OUTER JOIN
Lewy zewnętrzny łącznik lub lewy łącznik powoduje, że wszystkie wiersze z pierwszej lub lewej strony tabeli są zachowane. Wiersze z drugiej lub prawej strony tabeli pojawiają się tylko wtedy, gdy mają mecz z wierszami z pierwszej tabeli. W przypadku, gdy są wartości z lewej tabeli, ale nie z prawej, tabela odczyta wartość null, co oznacza, że wartość nie została ustawiona.
RIGHT OUTER JOIN
Prawe złącze zewnętrzne lub prawe złącze jest takie samo jak lewe złącze, z tym że role są odwrócone. Wszystkie wiersze z tabeli po prawej stronie wyświetlają się w wyniku, ale wiersze z tabeli po lewej stronie są tam tylko wtedy, gdy pasują do tabeli na racja. Puste spacje są null, podobnie jak w przypadku lewego łącznika.
PEŁNE ZŁĄCZE ZEWNĘTRZNE
Pełne zewnętrzne połączenie, lub po prostu zewnętrzne połączenie, tworzy zestaw wyników ze wszystkimi wierszami obu tabel, niezależnie od tego, czy są jakieś dopasowania. Podobnie jak lewy i prawy łącznik, puste przestrzenie nazywamy null.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-20 01:30:53
-
INNER JOIN
najbardziej typowe połączenie dla dwóch lub więcej tabel. Zwraca dopasowanie danych zarówno w tabeli w relacji primarykey, jak i forignkey. -
{[2] } jest taki sam jak
INNER JOIN
, ale zawiera również daneNULL
na ResultSet.-
LEFT JOIN
=INNER JOIN
+ niezrównane dane lewej tabeli z Null match na prawej tabeli. -
RIGHT JOIN
=INNER JOIN
+ niezrównane dane prawej tabeli z NULL match na lewej tabeli. -
FULL JOIN
=INNER JOIN
+ niezrównane dane zarówno po prawej, jak i pozostawione tabele z NULL matches.
-
- SELF join nie jest słowem kluczowym w SQL, gdy tabela odwołuje się do danych jako self join. Używając
INNER JOIN
iOUTER JOIN
możemy pisać własne zapytania join.
Na przykład:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 07:34:09
Jaka jest różnica między "wewnętrznym połączeniem" a "zewnętrznym połączeniem"?
Są to najczęściej używane operatory egzystencjalne w SQL, gdzie {[8] } jest używane dla 'exists' i LEFT OUTER JOIN
jest używane dla 'does not exist'.
Rozważ te zapytania:
users who have posted and have votes
users who have posted but have no badges
Osoby szukające rozwiązań opartych na zestawach (termin branżowy) rozpoznają odpowiednie zapytania jako: {28]}
users who have posted INTERSECT users who have votes
users who have posted MINUS users who have badges
Tłumaczenie ich na standardowy SQL:
SELECT UserId FROM Posts
INTERSECT
SELECT UserId FROM Votes;
SELECT UserId FROM Posts
EXCEPT
SELECT UserId FROM Badges;
Inni pomyślą podobne linie włączenia zestawu:
users who have posted and IN the set of users who have votes
users who have posted and NOT IN the set of users who have badges
Tłumaczenie ich na standardowy SQL:
SELECT UserId
FROM Posts
WHERE UserId IN ( SELECT UserId FROM Votes );
SELECT UserId
FROM Posts
WHERE UserId NOT IN ( SELECT UserId FROM Badges );
Niektórzy będą myśleć w kategoriach "egzystencji" w ramach zbiorów, np.
users who have posted and EXIST in the set of users who have votes
users who have posted and do NOT EXIST in the set of users who have badges
Tłumaczenie ich na standardowy SQL (Uwaga musimy teraz użyć zmiennych zakresu tj. p
, v
, b
):
SELECT p.UserId
FROM Posts p
WHERE EXISTS ( SELECT *
FROM Votes v
WHERE v.UserId = p.UserId );
SELECT p.UserId
FROM Posts p
WHERE NOT EXISTS ( SELECT *
FROM Badges b
WHERE b.UserId = p.UserId );
Jednak odkryłem, że "standardem branżowym" jest wyłącznie używanie połączeń. Nie wiem o co tu chodzi (prawo instrumentu ? przedwczesny optymalizacja ?), więc przejdę od razu do składni:
SELECT p.UserId
FROM Posts p
INNER JOIN Votes v ON v.UserId = p.UserId;
SELECT p.UserId
FROM Posts p
LEFT JOIN Badges b ON b.UserId = p.UserId
WHERE b.UserId IS NULL;
Rzeczy do zapamiętania:
- jedyna projekcja jest z {[13] } ale wciąż potrzebujemy tych wszystkich zmiennych zakresowych(
p
,v
,b
) dla warunków wyszukiwania. -
UserId IS NULL
warunek wyszukiwania 'należy' doOUTER JOIN
, ale jest odłączony w zapytaniu. -
LEFT
jest standardem branżowym: profesjonaliści przepiszą zapytanie, aby uniknąć używaniaRIGHT
! - słowo kluczowe
OUTER
zLEFT OUTER JOIN
to pominięte.
Uwagi końcowe:
Czasami łączniki są używane w zapytaniach wyłącznie w celu określenia, czy wartości istnieją lub nie istnieją w innym zbiorze. Naucz się uważnie patrzeć na wyświetlane atrybuty( kolumny w klauzuli SELECT
): jeśli nie ma żadnych z połączonej tabeli, są one po prostu używane jako operatory egzystencjalne. Dodatkowo w przypadku połączenia zewnętrznego poszukaj instancji <key_column> IS NULL
w klauzuli WHERE
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 12:48:44
Inner join - An inner join używając jednego z równoważnych zapytań daje przecięcie dwóch tabel , tzn. dwóch wspólnych wierszy.
-
Left outer join - A LEFT outer join Da wszystkie wiersze w A, plus wszystkie wspólne wiersze w B.
-
Full outer join - A full outer join da ci połączenie A i B, tzn. wszystkie wiersze w A i wszystkie wiersze w B. Jeśli coś w A nie ma odpowiedniego punktu odniesienia w B, wtedy część B jest null, a vice versay
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 13:55:57
W Prostych Słowach,
1.INNER JOIN lub EQUI JOIN: zwraca zestaw wyników, który pasuje Tylko do warunku w obu tabelach.
2.OUTER JOIN: zwraca zestaw wynikowy wszystkich wartości z obu tabel, nawet jeśli warunek jest zgodny lub nie.
3. LEFT JOIN: zwraca zestaw wynikowy wszystkich wartości z lewej tabeli i tylko wierszy, które pasują do warunku w prawej tabeli.
4.RIGHT JOIN: zwraca zestaw wyników wszystkich wartości z prawej tabeli i tylko wiersze, które pasują do warunku w lewej tabeli.
5.FULL JOIN: Full Join i Full outer Join są takie same.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-13 09:04:54
1.Inner Join: nazywany również Join. Zwraca wiersze obecne zarówno w lewej tabeli, jak i w prawej tabeli tylko , jeśli istnieje dopasowanie . W przeciwnym razie zwraca zero rekordów.
Przykład:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2.pełne połączenie zewnętrzne: nazywane również pełnym połączeniem. Zwraca wszystkie wiersze obecne zarówno w lewej, jak i prawej tabeli.
Przykład:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3.LEFT Outer join: Or po prostu nazywa się Left Join. Zwraca wszystkie wiersze obecne w lewej tabeli i pasujące wiersze z prawej tabeli (jeśli istnieją).
4.Right Outer Join: nazywane również jako Right Join. Zwraca pasujące wiersze z lewej tabeli (jeśli istnieją) oraz wszystkie wiersze obecne w prawej tabeli.
Zalety łączenia
- wykonuje się szybciej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 04:17:49
Różnica między złączem wewnętrznym a zewnętrznym jest następująca:
- inner join to join, który łączy tabele oparte na dopasowanych krotkach, podczas gdy outer join to join, który łączy tabelę opartą na dopasowanych i niedopasowanych krotkach.
- inner join łączy dopasowany wiersz z dwóch tabel, gdzie niepasowany wiersz jest pominięty, podczas gdy zewnętrzne join łączy wiersze z dwóch tabel i niepasowane wiersze wypełniają wartością null.
- połączenie wewnętrzne jest jak operacja przecięcia, podczas gdy zewnętrzne dołączenie jest jak operacja związkowa.
- Złącze wewnętrzne to dwa typy, podczas gdy złącze zewnętrzne to trzy typy. Połączenie wewnętrzne jest wolniejsze, podczas gdy połączenie zewnętrzne jest szybsze niż połączenie wewnętrzne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 12:25:56