Jaka jest różnica między połączeniami lewy, prawy, zewnętrzny i wewnętrzny?

562

Zastanawiam się, jak odróżnić te wszystkie różne połączenia ...

MrM
źródło
60
from Coding Horror Wizualne objaśnienie połączeń SQL
SQLMenace
3
Zależy również od twojego poziomu zrozumienia, dla kogoś takiego jak ty ten artykuł nic nie robi, ale dla kogoś, kto może nie do końca rozumie dołączenia, jest całkiem jasne
SQLMenace 15.01.2009
6
To jest duplikat stackoverflow.com/questions/419375/sql-join-differences i bez wątpienia inni ...
cletus
1
To bardzo mi pomogło ... najłatwiej jest stworzyć stoły testowe i grać z nimi. = P
daGrevis

Odpowiedzi:

797

Prosty przykład : załóżmy, że masz Studentsstół i Lockersstół. W SQL, pierwsza tabela określić w sposób przyłączyć Students, to lewa tabela, a druga, Lockers, jest PRAWO stół.

Każdego ucznia można przypisać do szafki, dlatego LockerNumberw Studenttabeli znajduje się kolumna . Więcej niż jeden uczeń może być potencjalnie w jednej szafce, ale szczególnie na początku roku szkolnego możesz mieć niektórych przybywających uczniów bez szafek i niektóre szafki, do których nie przypisano żadnych uczniów.

Na potrzeby tego przykładu załóżmy, że masz 100 uczniów , z czego 70 ma szafki. Masz w sumie 50 szafek , z czego 40 ma co najmniej 1 ucznia, a 10 szafek nie ma studenta.

INNER JOIN jest równoznaczne z „ pokaż mi wszystkich uczniów z szafkami ”.
Brakuje uczniów bez szafek lub szafek bez uczniów.
Zwraca 70 wierszy

DOŁĄCZ DO LEWEGO ZEWNĘTRZNEGOpokaż mi wszystkich uczniów, wraz z odpowiednią szafką, jeśli mają taką ”.
Może to być ogólna lista studentów lub może być wykorzystana do identyfikacji studentów bez szafki.
Zwraca 100 wierszy

PRAWA DOŁĄCZONA ZEWNĘTRZNA byłaby „ pokaż mi wszystkie szafki, a studenci przydzieleni do nich, jeśli są ”.
Można to wykorzystać do identyfikacji szafek, do których nie przypisano studentów, lub szafek, w których jest zbyt wielu studentów.
Zwraca 80 wierszy (lista 70 uczniów w 40 szafkach plus 10 szafek bez studenta)

FULL OUTER JOIN byłby głupiutki i prawdopodobnie mało przydatny.
Coś w stylu „ pokaż mi wszystkich uczniów i wszystkie szafki i dopasuj je tam, gdzie możesz
Zwraca 110 wierszy (wszystkich 100 studentów, w tym bez szafek. Plus 10 szafek bez studenta)

CROSS JOIN jest również dość głupi w tym scenariuszu.
Nie używa połączonego lockernumberpola w tabeli uczniów, więc w zasadzie otrzymujesz ogromną listę wszystkich możliwych par uczniów i szafek, niezależnie od tego, czy faktycznie istnieje.
Zwraca 5000 wierszy (100 studentów x 50 szafek). Może być przydatny (z filtrowaniem) jako punkt wyjścia do dopasowania nowych uczniów do pustych szafek.

BradC
źródło
12
Na twoim przykładzie, połączenie CROSS byłoby przydatne jako punkt wyjścia do tworzenia przypisań szafek: zacznij od wszystkich możliwych kombinacji, a następnie użyj innych kryteriów, aby odfiltrować wyniki z listy.
Joel Coehoorn
1
Niezła odpowiedź. Uważam, że Cross Join jest najczęściej używany do generowania danych testowych z kilku wierszy, gdy potrzebujesz dużej liczby rekordów.
Eli
6
PEŁNE ŁĄCZENIA ZEWNĘTRZNE mogą być przydatne podczas wyszukiwania osieroconych danych lub przy porównywaniu różnych wersji tego samego zestawu danych.
Lara Dougan
3
Połącz krzyżowo
3
Myślę, że sposób rozpoczęcia zapytania wpływa na wynik typu łączenia. Na przykład SELECT * FROM students RIGHT OUTER JOIN lockers...spowoduje inny wynik niż SELECT * FROM lockers RIGHT OUTER JOIN students.... Świetna odpowiedź, ale chciałbym, aby była zaktualizowana o pełne SQLzapytania
jbmilgrom
141

Istnieją trzy podstawowe typy łączenia:

  • INNERjoin porównuje dwie tabele i zwraca wyniki tylko tam, gdzie istnieje dopasowanie. Rekordy z 1. tabeli są duplikowane, gdy pasują do wielu wyników w 2. tabeli. Złączenia INNER zwykle zmniejszają zestawy wyników, ale ponieważ można kopiować rekordy, nie jest to gwarantowane.
  • CROSSjoin porównuje dwie tabele i zwraca każdą możliwą kombinację wierszy z obu tabel. Możesz uzyskać wiele wyników z tego rodzaju łączenia, które mogą nawet nie mieć znaczenia, więc używaj go ostrożnie.
  • OUTERjoin porównuje dwie tabele i zwraca dane, gdy dopasowanie jest dostępne lub w przeciwnym razie wartości NULL. Podobnie jak w przypadku łączenia INNER, spowoduje to zduplikowanie wierszy w jednej tabeli, gdy dopasuje wiele rekordów w drugiej tabeli. Złączenia OUTER zwykle powiększają zestawy wyników, ponieważ same w sobie nie usuwają żadnych rekordów z zestawu. Musisz także zakwalifikować połączenie OUTER, aby określić, kiedy i gdzie dodać wartości NULL:
    • LEFT oznacza, że ​​przechowuj wszystkie rekordy z pierwszej tabeli bez względu na wszystko i wstaw wartości NULL, gdy druga tabela nie pasuje.
    • RIGHT oznacza coś przeciwnego: przechowuj wszystkie rekordy z drugiej tabeli bez względu na wszystko i wstaw wartości NULL, jeśli pierwsza tabela nie pasuje.
    • FULL oznacza zachowaj wszystkie rekordy z obu tabel i wstaw wartość NULL do każdej tabeli, jeśli nie ma zgodności.

Często widać, że OUTERsłowo kluczowe zostanie pominięte w składni. Zamiast tego będzie to po prostu „LEFT JOIN”, „RIGHT JOIN” lub „FULL JOIN”. Dzieje się tak, ponieważ sprzężenia WEWNĘTRZNE i KRZYŻOWE nie mają znaczenia w odniesieniu do LEWEGO, PRAWEGO lub PEŁNEGO, a więc same w sobie wystarczają do jednoznacznego wskazania sprzężenia ZEWNĘTRZNEGO.

Oto przykład, kiedy możesz chcieć użyć każdego typu:

  • INNER: Chcesz zwrócić wszystkie rekordy z tabeli „Faktura” wraz z odpowiadającymi im „Fakturami”. Zakłada się, że każda ważna faktura będzie miała co najmniej jedną linię.
  • OUTER: Chcesz zwrócić wszystkie rekordy „InvoiceLines” dla konkretnej faktury, wraz z odpowiadającymi im rekordami „InventoryItem”. Jest to firma, która również sprzedaje usługi, dzięki czemu nie wszystkie linie faktur będą miały IventoryItem.
  • CROSS: Masz tabelę cyfr z 10 wierszami, z których każda zawiera wartości od „0” do „9”. Chcesz utworzyć tabelę zakresu dat, do której chcesz dołączyć, aby uzyskać jeden rekord dla każdego dnia w zakresie. Łącząc krzyżowo z tą tabelą wielokrotnie, możesz utworzyć tyle kolejnych liczb całkowitych, ile potrzebujesz (biorąc pod uwagę, że zaczynasz od 10 do 1. mocy, każde sprzężenie dodaje 1 do wykładnika). Następnie użyj funkcji DATEADD (), aby dodać te wartości do daty bazowej dla zakresu.
Joel Coehoorn
źródło
1
Miły. Dodałbym, że zwykle, jeśli napiszesz tylko „DOŁĄCZ”, oznacza to WEJŚCIE WEWNĘTRZNE.
matpop
47

Istnieją tylko 4 rodzaje:

  1. Łączenie wewnętrzne : najczęstszy typ. Wiersz wyjściowy jest tworzony dla każdej pary wierszy wejściowych pasujących do warunków łączenia.
  2. Lewe sprzężenie zewnętrzne : to samo co sprzężenie wewnętrzne, z tym wyjątkiem, że jeśli istnieje jakikolwiek wiersz, dla którego nie można znaleźć pasującego wiersza w tabeli po prawej stronie, wyprowadzany jest wiersz zawierający wartości z tabeli po lewej stronie, NULLdla każdego wartość w tabeli po prawej stronie. Oznacza to, że każdy wiersz z tabeli po lewej stronie pojawi się co najmniej raz na wyjściu.
  3. Prawy łącznik zewnętrzny : Taki sam jak lewy łącznik zewnętrzny, z tą różnicą, że role tabel zostały odwrócone.
  4. Pełne połączenie zewnętrzne : połączenie lewego i prawego połączenia zewnętrznego. Każdy wiersz z obu tabel pojawi się na wyjściu przynajmniej raz.

„Łączenie krzyżowe” lub „łączenie kartezjańskie” jest po prostu łączeniem wewnętrznym, dla którego nie określono warunków łączenia, w wyniku czego wyprowadzane są wszystkie pary wierszy.

Dzięki RusselH za wskazanie PEŁNYCH złączeń, które pominąłem.

j_random_hacker
źródło
1
co z pełnym łączeniem zewnętrznym i łączeniem krzyżowym (produkt kartezjański)?
SQLMenace
full jest tak naprawdę odpowiednikiem dwóch zewnętrznych złączeń
RussellH
25
PEŁNE jest to, co dostajesz, gdy spieprzysz swoje wewnętrzne połączenie, a następnie zadajesz pytanie „dlaczego otrzymuję N ^ 2 wierszy zamiast N”? Wtedy wszyscy dostaną na ciebie KRZYŻ.
Paul Tomblin
24

Różnica JOINS SQL:

Bardzo prosty do zapamiętania:

INNER JOIN pokaż tylko rekordy wspólne dla obu tabel.

OUTER JOIN cała zawartość obu tabel jest scalana ze sobą albo jest dopasowana, albo nie.

LEFT JOINjest taki sam jak LEFT OUTER JOIN- (Wybierz rekordy z pierwszej (skrajnie lewej) tabeli z pasującymi rekordami prawej tabeli.)

RIGHT JOINjest taki sam jak RIGHT OUTER JOIN- (Wybierz rekordy z drugiej (najbardziej po prawej) tabeli z pasującymi rekordami lewej tabeli.)

wprowadź opis zdjęcia tutaj

Laxmi
źródło
Istnieje poprawny i odpowiedni sposób na oznaczenie okręgów diagramu Venna, ale to nie wszystko. Kręgi nie są tabelami wprowadzania. Również wiersze wyników nie są wierszami wejściowymi, więc twój opis jest tam niepoprawny. Nie jest to również jasne - nie wyjaśniasz „wspólne dla obu”, „dopasowane”, „scalone”.
philipxy
9

Sprawdź Join (SQL) na Wikipedii

  • Łączenie wewnętrzne - Biorąc pod uwagę dwie tabele, łączenie wewnętrzne zwraca wszystkie wiersze istniejące w obu tabelach
  • złączenie lewy / prawy (zewnętrzny) - biorąc pod uwagę, że dwie tabele zwracają wszystkie wiersze istniejące w lewej lub prawej tabeli złączenia, a wiersze z drugiej strony zostaną zwrócone, gdy klauzula złączenia będzie zgodna, lub wartość null zostanie zwrócona dla te kolumny

  • Pełny zewnętrzny - dane dwie tabele zwracają wszystkie wiersze i zwracają wartości null, gdy nie ma ani lewej ani prawej kolumny

  • Połączenia krzyżowe - łączenie kartezjańskie i może być niebezpieczne, jeśli nie zostanie ostrożnie użyte

JoshBerke
źródło
6

Zwiększenie widoczności może pomóc. Jeden przykład:

Tabela 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tabela 2:

ID_STUDENT LOCKER

3               l1
4               l2
5               l3

Co otrzymam, kiedy to zrobię:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3
lfvv
źródło
4

LEFT JOINi RIGHT JOINsą typami OUTER JOINs.

INNER JOIN jest wartością domyślną - wiersze z obu tabel muszą być zgodne z warunkiem łączenia.

RussellH
źródło
5
Nie mogę uwierzyć, że ta odpowiedź ma wiele pozytywnych opinii, a jednocześnie jest tak niepełna.
nbro
Myślę, że była to lepsza odpowiedź na pierwotne pytanie.
RussellH
3

Łączenie wewnętrzne : pokazuje tylko wiersze, gdy ma dane z obu tabel.

Sprzężenie zewnętrzne : (lewo / prawo) : pokaż wszystkie wyniki z lewej / prawej tabeli z sparowany row ( s ), jeśli istnieje , czy nie.

Pethő Jonatán
źródło
2

Najpierw musisz zrozumieć, co robi dołączenie? Łączymy wiele tabel i uzyskujemy określony wynik z połączonych tabel. Najprostszym sposobem na to jest połączenie krzyżowe .

Powiedzmy, że tabela A ma dwie kolumny A i B. A tabela B ma trzy kolumny C i D. Jeśli zastosujemy łączenie krzyżowe, spowoduje to powstanie wielu bezsensownych wierszy. Następnie musimy dopasować za pomocą klucza podstawowego, aby uzyskać rzeczywiste dane.

Po lewej: zwróci wszystkie rekordy z lewej tabeli i dopasowane rekordy z prawej tabeli.

Po prawej: powróci przeciwnie do lewy łączenie. Zwróci wszystkie rekordy z prawej tabeli i dopasowane rekordy z lewej tabeli.

Wewnętrzna: To jest jak skrzyżowanie. Zwróci tylko dopasowane rekordy z obu tabel.

Zewnętrzny: I to jest jak związek. Zwróci wszystkie dostępne rekordy z obu tabel.

Czasami nie potrzebujemy wszystkich danych, a także powinniśmy potrzebować tylko wspólnych danych lub rekordów. możemy go łatwo uzyskać za pomocą tych metod łączenia. Pamiętaj, że lewy i prawy łącznik również są złączeniem zewnętrznym.

Możesz uzyskać wszystkie rekordy za pomocą połączenia krzyżowego. Ale może to być kosztowne, jeśli chodzi o miliony płyt. Uprość to, używając łączenia lewego, prawego, wewnętrznego lub zewnętrznego.

dzięki

HM Nayem
źródło