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
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ĘTRZNEGO „ pokaż 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.
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.
Miły. Dodałbym, że zwykle, jeśli napiszesz tylko „DOŁĄCZ”, oznacza to WEJŚCIE WEWNĘTRZNE.
matpop
47
Istnieją tylko 4 rodzaje:
Łączenie wewnętrzne : najczęstszy typ. Wiersz wyjściowy jest tworzony dla każdej pary wierszy wejściowych pasujących do warunków łączenia.
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.
Prawy łącznik zewnętrzny : Taki sam jak lewy łącznik zewnętrzny, z tą różnicą, że role tabel zostały odwrócone.
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.
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.)
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”.
Łą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
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ę:
-InnerjoinofTable1andTable2:-Innerjoin returns both tables merged only when the key(ID_STUDENT)existsin both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-LeftjoinofTable1andTable2:-Leftjoin merges both tables withall records form table1,in
other words, there might be non-populated fields fromtable2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
-Rightjoinoftable1andtable2:-Rightjoin merges both tables withall records fromtable2,in
other words, there might be non-populated fields fromtable1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5- l3
-Outter joinoftable1andtable2:- Returns all records from both tables,in other words, there
might be non-populated fields either fromtable1or2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
5- l3
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.
Odpowiedzi:
Prosty przykład : załóżmy, że masz
Students
stół iLockers
stół. 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
LockerNumber
wStudent
tabeli 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ĘTRZNEGO „ pokaż 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
lockernumber
pola 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.
źródło
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łneSQL
zapytaniaIstnieją trzy podstawowe typy łączenia:
INNER
join 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.CROSS
join 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.OUTER
join 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
OUTER
sł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.źródło
Istnieją tylko 4 rodzaje:
NULL
dla 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.„Łą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.
źródło
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 JOIN
jest taki sam jakLEFT OUTER JOIN
- (Wybierz rekordy z pierwszej (skrajnie lewej) tabeli z pasującymi rekordami prawej tabeli.)RIGHT JOIN
jest taki sam jakRIGHT OUTER JOIN
- (Wybierz rekordy z drugiej (najbardziej po prawej) tabeli z pasującymi rekordami lewej tabeli.)źródło
Sprawdź Join (SQL) na Wikipedii
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
źródło
Zwiększenie widoczności może pomóc. Jeden przykład:
Tabela 1:
ID_STUDENT STUDENT_NAME
Tabela 2:
ID_STUDENT LOCKER
Co otrzymam, kiedy to zrobię:
źródło
LEFT JOIN
iRIGHT JOIN
są typamiOUTER JOIN
s.INNER JOIN
jest wartością domyślną - wiersze z obu tabel muszą być zgodne z warunkiem łączenia.źródło
Łą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.
źródło
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
źródło