it-swarm.dev

Jaka jest różnica między WEJŚCIEM WEWNĘTRZNYM a DOŁĄCZONYM DO ZEWNĘTRZNEGO?

Jestem nowy w SQL i chciałem wiedzieć, jaka jest różnica między tymi dwoma typami JOIN?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

Kiedy powinienem użyć jednego lub drugiego?

35
Julien
  • połączenie wewnętrzne wybierze tylko te rekordy, w których znajdują się połączone klucze oba określone tabele.
  • lewe złączenie zewnętrzne wybierze wszystkie rekordy z pierwszej tabeli i wszelkie rekordy w drugiej tabeli, które pasują do połączonych kluczy.
  • prawe łączenie zewnętrzne wybierze wszystkie rekordy z drugiej tabeli i wszelkie rekordy w pierwszej tabeli, które pasują do połączonych kluczy.

W pierwszym przykładzie zwrócisz listę użytkowników i numerów telefonów tylko wtedy, gdy dla użytkownika istnieje co najmniej jeden rekord telefoniczny.

W drugim przykładzie zwrócisz listę wszyscy użytkowników, a także wszelkie dane telefoniczne, jeśli są dostępne (jeśli nie są dostępne, otrzymasz NULL za telefon wartości).

Za każdym razem, gdy ktoś zadaje to pytanie, pojawia się odpowiedź: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Mam nadzieję, że pomoże ci to zrozumieć,

13
Spredzy

Sprzężenie wewnętrzne zwraca wiersze, które można łączyć na podstawie kryteriów łączenia.
Sprzężenie zewnętrzne zwraca te i wszystkie wiersze ...
... z pierwszej tabeli dla lewego złączenia
... z drugiej tabeli dla prawego połączenia
... z obu tabel dla pełnego sprzężenia

Wybór, kiedy użyć jednego lub drugiego, jest kwestią ustalenia, jakich danych potrzebujesz. Na przykład, jeśli potrzebujesz tylko rekordów zawierających identyfikatory użytkownika z telefonu, które pasują do identyfikatora użytkownika, użyj sprzężenia wewnętrznego. Jeśli chcesz również dołączyć wiersze od użytkownika, które nie mają pasującego wpisu telefonicznego, odpowiednie byłoby lewe łączenie.

Aby uzyskać więcej informacji, zobacz to pytanie na StackOverflow .

8
Leigh Riffel

Jeśli masz 2 tabele jak poniżej:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Jeśli użyjesz funkcji dołączenia wewnętrznego, otrzymasz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

Jeśli użyjesz Full Outer Join, otrzymasz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Jeśli użyjesz Left Outer Join, otrzymasz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
7
Am1rr3zA

Łączenie zewnętrzne jest wyraźnie zaprojektowane tak, aby dawało w wyniku wartości zerowe i dlatego należy go ogólnie unikać. Mówiąc relatywnie, jest to rodzaj małżeństwa ze strzelbą: zmusza stoły do ​​pewnego rodzaju związku - tak, mam na myśli związek, a nie przyłączanie się - nawet gdy dane tabele nie spełniają zwykłych wymagań dotyczących związku. Robi to w efekcie, wypełniając jedną lub obie tabele zerami przed wykonaniem unii, tym samym dostosowując je do tych zwykłych wymagań. Ale nie ma powodu, dla którego tego wypełnienia nie należy wykonywać przy użyciu odpowiednich wartości zamiast wartości zerowych, jak w tym przykładzie:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

Alternatywnie, ten sam wynik można uzyskać za pomocą zewnętrznego operatora łączenia SQL w połączeniu z COALESCE, jak tutaj:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

waga na temat sprzężenia zewnętrznego (4.6) w „Teorii SQL i relacyjnej: Jak pisać dokładny kod SQL” według C.J. Data

6
onedaywhen

Łączenie wewnętrzne to łączenie, w którym wyświetlane są tylko wyniki, w których klucze znajdują się w obu tabelach. Sprzężenie zewnętrzne wyświetli wyniki dla wszystkich kluczy w jednej tabeli, lewe złączenie od pierwszego i prawe złączenie od drugiego. Na przykład:

Załóżmy, że tabela 1 zawiera następujące pary kluczy podstawowych i danych: (1, a), (2, b), (3, c)

Powiedzmy również, że tabela 2 zawiera następujące pary kluczy podstawowych i danych: (1, zabawa), (3, puszka), (4, zdarzenie)

Zatem wewnętrzne sprzężenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (najpierw wspólny klucz podstawowy, drugi element pierwszej tabeli drugi, a drugi element drugiej tabeli trzeci): (1, a, fun), ( 3, c, puszka)

Lewe zewnętrzne połączenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (taki sam format jak powyżej): (1, a, fun), (2, b, NULL), (3, c, can)

Prawe zewnętrzne połączenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (taki sam format jak powyżej): (1, a, fun), (3, c, can), (4, NULL, happ)

Mam nadzieję, że to dobrze wyjaśnia tę koncepcję.

5
indyK1ng

Ponieważ zapytałeś, kiedy użyć czego, oto scenariusz z zapytaniami - wybierz, którego użyć w zależności od wymagań.

Dane:

Użytkownicy tabeli mają 10 rekordów. Tabela Phoneno ma 6 rekordów (z relacją 1: 1, co oznacza, że ​​wpis w PhoneNo będzie odnosił się tylko do jednego wpisu w Użytkownicy, a tylko jeden wpis w PhoneNo może odnosić się do danego wpisu w Użytkownikach).

Wymaganie 1: Pokaż wszystkim użytkownikom ich numery telefonów. Zignoruj ​​użytkowników bez numeru telefonu.

Pytanie:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

Wynik: pokazuje 6 użytkowników, którzy mają numer telefonu

Wymaganie 2: Pokaż wszystkim użytkownikom ich numer telefonu. Jeśli użytkownik nie ma wyświetlacza telefonu „Nie dotyczy” (niedostępne)

Pytanie:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

Wynik:

Pokazuje wszystkie 10 rekordów

Uwaga: ifnull to składnia MySql do transformacji wartości null. Użyłem tej funkcji, aby silnik db pokazywał „N/A”, gdy phonno ma wartość null. Poszukaj odpowiedniej funkcji, jeśli używasz innego DBMS. W SQL Server musisz użyć instrukcji CASE.

Mam nadzieję, że to pomoże.

4
AmDB

Pozwól mi spróbować opisać to nieco bardziej intuicyjnie.

Łączenie wewnętrzne pokazuje użytkowników, którzy mają jeden lub więcej telefonów wraz z ich numerami telefonicznymi.

Lewy zewnętrzny łącznik dodatkowo wymienia tych „użytkowników”, którzy nie mają telefonu.

4
bernd_k