Zastanawiam się, jak odróżnić te wszystkie różne połączenia ...
Zastanawiam się, jak odróżnić te wszystkie różne połączenia ...
Odpowiedzi:
Prosty przykład : załóżmy, że masz Students
stół i Lockers
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
w Student
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.
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 SQL
zapytania
Istnieją 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.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óż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 jak LEFT OUTER JOIN
- (Wybierz rekordy z pierwszej (skrajnie lewej) tabeli z pasującymi rekordami prawej tabeli.)
RIGHT JOIN
jest taki sam jak RIGHT OUTER JOIN
- (Wybierz rekordy z drugiej (najbardziej po prawej) tabeli z pasującymi rekordami lewej tabeli.)
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
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
LEFT JOIN
i RIGHT JOIN
są typami OUTER JOIN
s.
INNER JOIN
jest wartością domyślną - wiersze z obu tabel muszą być zgodne z warunkiem łączenia.
Łą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.
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