LEFT JOIN vs. LEFT OUTER JOIN w SQL Server

1595

Jaka jest różnica między LEFT JOINi LEFT OUTER JOIN?

KG Sosa
źródło
213
Żaden! Słowo OUTERkluczowe jest opcjonalne.
jarlh
9
Diagramy Venna nie są odpowiednie dla odpowiedzi na to pytanie. Odpowiedź na to pytanie jest Brak . Zobacz pierwszy komentarz.
philipxy
3
Wykresy Venna zilustrowania różnicy w rzędach wyjściowych dla szczególnych przypadkach z wewnętrzną vs sprzężenia zewnętrznego . Jeśli nie zostaną wprowadzone wartości null ani zduplikowane wiersze (możemy więc przyjąć tabelę za zestaw wartości o wartościach wierszy i użyć normalnej równości matematycznej), wówczas lewe i prawe kółka przechowują tabele wyjściowe / zestawy lewego i prawego łączenia . Ale jeśli wprowadzane są wartości zerowe lub zduplikowane wiersze, tak trudno jest wyjaśnić, czym są koła i jak te zbiory odnoszą się do tabel / worków wejściowych i wyjściowych, że diagramy Venna nie są pomocne. Zobacz moje komentarze tutaj dotyczące innych nadużyć na diagramie Venna.
philipxy

Odpowiedzi:

2236

Zgodnie z dokumentacją: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Słowo kluczowe OUTERjest oznaczone jako opcjonalne (ujęte w nawias kwadratowy). W tym konkretnym przypadku, czy podasz OUTERczy nie, nie ma znaczenia. Należy zauważyć, że podczas gdy inne elementy dołączyć klauzuli jest również oznaczone jako opcjonalne, pozostawiając je na zewnątrz będzie zrobić różnicę.

Na przykład cała część typu JOINklauzuli jest opcjonalna, w takim przypadku domyślną wartością jest, INNERjeśli tylko ją określisz JOIN. Innymi słowy, jest to legalne:

SELECT *
FROM A JOIN B ON A.X = B.Y

Oto lista równoważnych składni:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Spójrz także na odpowiedź, którą zostawiłem na to inne SO pytanie: SQL pozostawił złączenie vs wiele tabel na linii FROM? .

wprowadź opis zdjęcia tutaj

Lasse V. Karlsen
źródło
135
Absolutnie poprawne. ZEWNĘTRZNY jest dozwolony dla zgodności z ANSI-92.
Sean Reilly,
11
@ LasseV.Karlsen nie byłoby lepiej mieć INNER JOINpo prawej i tylko JOINpo lewej stronie na liście ekwiwalentów?
nawfal
8
@ LasseV.Karlsen Chciałem tylko powiedzieć, że lewa strona ma zwięzłą formę, a prawa strona ma rozwiniętą formę. Pomyślałem, że to sprawi, że będzie spójne, jeśli będziesz postępować tak samo dla JOINs.
nawfal
30
@Outlier To twoja prerogatywa, ale wyraźnie 451 innych osób uważało, że odpowiedź była dobra. Szczerze mówiąc, jeśli jedna odpowiedź mówi X, a inna odpowiedź X i odwołuje się do dokumentacji, a także kopiuje odpowiednie fragmenty dokumentacji do odpowiedzi, mój głos przechodzi na drugą odpowiedź i dlatego piszę swoje odpowiedzi w ten sposób Ja robię. To, że ktoś twierdzi, że X nie jest dobre. Jeśli potrafisz udowodnić X, to lepiej (nie lekceważąc odpowiedzi sactiw). Ale Twoim obowiązkiem jest myśleć, co chcesz. Pytam, dlaczego uważasz, że to bezcelowe, czy odpowiedź jest w jakikolwiek sposób błędna?
Lasse V. Karlsen
7
@Outlier I szczerze mówiąc, jeśli nie masz ochoty czytać moich „długich” odpowiedzi, to moja odpowiedź nie była dla ciebie. Jest dla wszystkich, którzy tu przyjeżdżają, zastanawiając się nad tym samym i chcąc dowiedzieć się, dlaczego tak jest, i gdzie znaleźć więcej informacji itp. Najwyraźniej jesteś typem faceta, który chciałby uzyskać odpowiedź: „Brak”, ale niestety nie jest tutaj prawną odpowiedzią na temat przepełnienia stosu, ani nie powinno tak być.
Lasse V. Karlsen
699

Aby odpowiedzieć na twoje pytanie, nie ma różnicy między LEFT JOIN a LEFT OUTER JOIN, są one dokładnie takie same , jak ...

Na najwyższym poziomie są głównie 3 rodzaje złączeń:

  1. WEWNĘTRZNY
  2. ZEWNĘTRZNY
  3. KRZYŻ

  1. DOŁĄCZ DO WEWNĘTRZNEGO - pobiera dane, jeśli występują w obu tabelach.

  2. DOŁĄCZ DO ZEWNĘTRZNEGO3 rodzaje:

    1. LEFT OUTER JOIN - pobiera dane, jeśli występują w lewej tabeli.
    2. RIGHT OUTER JOIN - pobiera dane, jeśli występują w odpowiedniej tabeli.
    3. FULL OUTER JOIN - pobiera dane, jeśli występują w jednej z dwóch tabel.
  3. CROSS JOIN , jak sama nazwa wskazuje, [n X m]łączy to wszystko ze wszystkim.
    Podobnie do scenariusza, w którym po prostu podajemy tabele do łączenia (w FROMklauzuli SELECTinstrukcji), używając przecinków, aby je rozdzielić.


Punkty do odnotowania:

  • Jeśli tylko wspominasz, JOINto domyślnie jest to INNER JOIN.
  • OUTERDołączyć musi być LEFT| RIGHT| FULLnie możesz po prostu powiedzieć OUTER JOIN.
  • Możesz upuścić OUTERsłowo kluczowe i po prostu powiedzieć LEFT JOINlub RIGHT JOINlub FULL JOIN.

Dla tych, którzy chcą wizualizować je w lepszy sposób, przejdź do tego linku: Objaśnienie połączeń SQL

sactiw
źródło
17
Bardzo dobra odpowiedź. Będzie to bardziej zrozumiałe, jeśli powiesz „POŁĄCZ ZEWNĘTRZNE - pobiera wszystkie dane z lewej tabeli z pasującymi danymi z prawej, jeśli jest ustawiona” dla 2.1 (i podobnej zmiany dla 2.2)
ssh
1
Możesz także wykonać połączenie krzyżowe, po prostu „wybierz * z tabeli A, tabeli B”
om471987,
3
Przepraszam, jeśli nekropluję, ale czy to CROSS JOINto samo co FULL JOIN?
TechnicalTophat
9
@RhysO nie, CROSS JOIN jest produktem kartezjańskim, tj. CROSS JOIN tabeli, mający n wierszy, z tabelą, m m wierszy, zawsze daje (n * m) wierszy, podczas gdy PEŁNE JOIN JOIN tabeli, mając n wierszy, z tabelą, mając m rzędów, da maksymalnie wiersze (n + m)
sactiw
1
@sactiw rozważ dodanie specjalnej uwagi w swojej cennej odpowiedzi na temat różnicy między Cross Joini Full Outer Join... w pewien sposób wydaje się podobny.
Manuel Jordan,
356

Jaka jest różnica między lewym złączeniem a lewym złączeniem zewnętrznym?

Nic . LEFT JOINi LEFT OUTER JOINsą równoważne.

Mitch Pszenica
źródło
13
erm cześć! kto to głosował? LEFT JOIN jest taki sam jak LEFT OUTER JOIN.
Mitch Wheat
7
Tak jest w przypadku Microsoft SQL Server i każdego innego RDBMS zgodnego z SQL.
Bill Karwin
7
Byłoby miło, gdybyś dodał odniesienie lub wyjaśnienie, dlaczego OUTERjest to opcjonalne.
Zero3 12.04.16
7
Najbardziej zwięzła, dokładna odpowiedź tutaj.
Manachi
4
Dziękuję Ci. Przyjęta odpowiedź zawierała zbyt wiele informacji, które sprawiły, że byłem bardziej zdezorientowany. Właśnie to musiałem wiedzieć i od razu odpowiedzieć na pierwotne pytanie.
Bacon Brad
66

Jestem DBA PostgreSQL, o ile mogłem zrozumieć różnicę między zewnętrznymi lub zewnętrznymi połączeniami Różnica jest tematem, który ma znaczną dyskusję w całym Internecie. Do dzisiaj nigdy nie widziałem różnicy między tymi dwoma; Poszedłem więc dalej i staram się znaleźć różnicę między nimi. Na koniec przeczytałem całą dokumentację na ten temat i znalazłem odpowiedź na to,

Więc jeśli spojrzysz na dokumentację (przynajmniej w PostgreSQL), możesz znaleźć tę frazę:

„Słowa INNERi OUTERsą opcjonalne we wszystkich formach. INNERJest domyślny; LEFT, RIGHTi FULLsugerować outer join”.

Innymi słowy,

LEFT JOINi są takie LEFT OUTER JOINsame

RIGHT JOINi są takie RIGHT OUTER JOINsame

Mam nadzieję, że może to być pomocne dla tych, którzy wciąż próbują znaleźć odpowiedź.

andrefsp
źródło
60

Left Joini Left Outer Joinsą jednym i tym samym . Ten pierwszy jest skrótem od drugiego. To samo można powiedzieć o związku Right Joini Right Outer Joinzwiązku. Demonstracja zilustruje równość. Robocze przykłady każdego zapytania zostały dostarczone przez SQL Fiddle . To narzędzie pozwoli na manipulowanie zapytaniem.

Dany

wprowadź opis zdjęcia tutaj

Połącz lewy i lewy zewnętrzny

wprowadź opis zdjęcia tutaj

Wyniki

wprowadź opis zdjęcia tutaj


Right Join i Right Outer Join

wprowadź opis zdjęcia tutaj

Wyniki

wprowadź opis zdjęcia tutaj

WorkSmarter
źródło
43

Łatwiej jest mi myśleć o połączeniach w następującej kolejności:

  • CROSS JOIN - kartezjański produkt z obu stołów. Wszystkie dołączenia zaczynają się tutaj
  • WEJŚCIE WEWNĘTRZNE - ŁĄCZENIE KRZYŻOWE z dodanym filtrem.
  • ŁĄCZENIE ZEWNĘTRZNE - ŁĄCZENIE WEWNĘTRZNE z dodanymi brakującymi elementami (z tabeli LEWEJ lub PRAWEJ).

Dopóki nie doszedłem do tego (relatywnie) prostego modelu, ŁĄCZENIA były zawsze bardziej czarną sztuką. Teraz mają doskonały sens.

Mam nadzieję, że to pomaga bardziej niż myli.

frozenjim
źródło
To nie odpowiada na pytanie.
philipxy
33

Dlaczego LEWE / PRAWE i LEWE ZEWNĘTRZNE / PRAWE ZEWNĘTRZNE są takie same? Wyjaśnijmy, dlaczego to słownictwo. Zrozum, że złączenia LEWE i PRAWE są szczególnymi przypadkami złączenia ZEWNĘTRZNEGO, a zatem nie może być niczym innym niż ZEWNĘTRZNY LEWY / ZEWNĘTRZNY PRAWY. Złączenie OUTER jest również nazywane PEŁNYM ZEWNĘTRZNYM, w przeciwieństwie do złączeń LEWY i PRAWY, które są CZĘŚCIOWYMI wynikami złączenia ZEWNĘTRZNEGO. W rzeczy samej:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Teraz jest jasne, dlaczego te operacje mają aliasy, a także jasne, że istnieją tylko 3 przypadki: WEWNĘTRZNE, ZEWNĘTRZNE, KRZYŻOWE. Z dwoma pod-skrzynkami dla OUTER. Słownictwo, sposób, w jaki tłumaczą to nauczyciele, a także niektóre powyższe odpowiedzi często sprawiają, że wygląda na to, że istnieje wiele różnych rodzajów łączenia. Ale w rzeczywistości jest to bardzo proste.

Yugo Amaryl
źródło
1
„jasne jest, że istnieją tylko 3 przypadki”: ciekawe, ale wadliwe. Weź pod uwagę, że sprzężenie wewnętrzne jest wyspecjalizowanym połączeniem krzyżowym (tj. Przeniesienie sprzężenia predykatów do klauzuli where). Ponadto należy wziąć pod uwagę, że łączenie zewnętrzne wcale nie jest złączeniem, a raczej unią, w której zamiast „brakujących” kolumn używane są wartości zerowe. Dlatego można argumentować, że krzyż jest jedynym wymaganym łączeniem. Należy zauważyć, że obecne myślenie w teorii relacyjnej jest takie, że naturalne połączenie spełnia wszystkie wymagania dotyczące łączenia. Na marginesie: czy możesz wyjaśnić, czy / jak słownictwo „ JOINimplikuje INNER JOIN” pasuje do twojego rozumowania zewnętrznego słownika łączenia?
poniedziałek,
27

Odpowiedzieć na Twoje pytanie

W Sql Server dołącza składnia OUTER jest opcjonalna

Jest wspomniany w artykule msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Tak więc poniższa lista pokazuje łączenie równoważnych składni zi bez parametru OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Inne równoważne składnie

INNER JOIN => JOIN
CROSS JOIN => ,

Gorąco polecam Dotnet Mob Artice: Dołącza do Sql Server wprowadź opis zdjęcia tutaj

masa
źródło
2
Jeśli chodzi o nadużywanie diagramów Venna, zobacz mój komentarz do pytania.
philipxy
20

Istnieją tylko 3 sprzężenia:

  • A) Łączenie krzyżowe = kartezjańskie (np .: Tabela A, Tabela B)
  • B) Łączenie wewnętrzne = DOŁĄCZ (np .: Tabela A Łączenie / Tabela łączenia wewnętrznego B)
  • C) Łączenie zewnętrzne:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Mam nadzieję, że to pomoże.

Delikatnie
źródło
1
Tak więc 5 łączy się całkowicie.
Zeek2,
19

Istnieją głównie trzy rodzaje DOŁĄCZENIA

  1. Wewnętrzny: pobiera dane, które są obecne w obu tabelach
    • Tylko DOŁĄCZ oznacza DOŁĄCZENIE WEWNĘTRZNE
  2. Zewnętrzne: są trzech rodzajów

    • LEWY ZEWNĘTRZNY - - pobiera dane obecne tylko w lewej tabeli i warunek dopasowania
    • PRAWY ZEWNĘTRZNY - - pobiera dane obecne tylko w odpowiedniej tabeli i pasujących warunkach
    • PEŁNY ZEWNĘTRZNY - - pobiera dane z dowolnej tabeli lub obu
    • (W LEWO, W PRAWO lub W PEŁNYM) ZŁĄCZE ZEWNĘTRZNE można zapisać bez pisania „ZEWNĘTRZNE”
  3. Cross Join: łączy wszystko ze wszystkim

Szorstki
źródło
16

Cukier syntaktyczny sprawia, że ​​zwykły czytelnik staje się bardziej oczywisty, że połączenie nie jest wewnętrznym.

Nieskomplikowane
źródło
2
Więc ... co to jest PEŁNE DOŁĄCZENIE DO ZEWNĘTRZNEGO?
Amy B
5
tabela A FULL OUTER JOIN tabela B da ci trzy typy rekordów: wszystkie rekordy w tabeli A bez pasującego rekordu w tabeli B, wszystkie rekordy w tabeli B bez pasującego rekordu w tabeli A oraz wszystkie rekordy w tabeli A z pasującym rekordem w tabeli B.
Dave DuPlantis
4

Właśnie w kontekście tego pytania chcę również opublikować 2 operatorów „ZASTOSUJ”:

ŁĄCZY :

  1. DOŁĄCZ DO WEWNĘTRZNEGO = DOŁĄCZ

  2. DOŁĄCZ DO ZEWNĄTRZ

    • LEWE DOŁĄCZENIE ZEWNĘTRZNE = LEWE DOŁĄCZENIE

    • PRAWE DOŁĄCZENIE DO ZEWNĘTRZNEGO = PRAWE DOŁĄCZENIE

    • FULL OUTER JOIN = PEŁNE DOŁĄCZENIE

  3. KRZYŻ DOŁĄCZ

SAMOŁĄCZENIE : To nie jest dokładnie osobny typ złączenia. Jest to w zasadzie łączenie tabeli z samym sobą za pomocą jednego z powyższych sprzężeń. Ale czułem, że warto wspomnieć w kontekście dyskusji JOIN, ponieważ usłyszysz ten termin od wielu członków społeczności SQL Developer.

ZASTOSUJ :

  1. ZASTOSOWANIE KRZYŻOWE - Podobne do WEJŚCIA WEWNĘTRZNEGO (ale ma tę zaletę, że może obliczyć coś w Prawej tabeli dla każdego wiersza Lewej tabeli i zwróci tylko pasujące wiersze)
  2. ZASTOSOWANIE ZEWNĘTRZNE - Podobne do POŁĄCZENIA ZEWNĘTRZNEGO (ale ma tę zaletę, że może obliczyć coś w Prawej tabeli dla każdego wiersza Lewej tabeli i zwróci wszystkie wiersze z Lewej tabeli, niezależnie od dopasowania w Prawej tabeli)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Przykład z życia, kiedy należy użyć ZEWNĘTRZNEJ / KRZYŻOWEJ APLIKACJI w SQL

Uważam, że operator APPLY jest bardzo korzystny, ponieważ zapewnia lepszą wydajność niż konieczność wykonywania tych samych obliczeń w podzapytaniu. Zastępują one także wiele funkcji analitycznych w starszych wersjach SQL Server. Dlatego uważam, że po zapoznaniu się z JOINS jeden programista SQL powinien następnie spróbować nauczyć się operatorów APPLY.

san
źródło