Chciałbym szybko zestawić typy złączeń MySQL. Wiem o tych, reszta nie jestem pewien, co mają na myśli.
- oddzielone przecinkami (od czego dokładnie jest to skrót?):
SELECT * FROM a, b WHERE b.id = a.beeId AND ...
- pokaż informacje z a, nawet jeśli nie ma dopasowań w b:
SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...
Widziałem inne łączenia, ale chcę wiedzieć, co je różni, co jest INNER
/ OUTER
, powoduje dodanie LEFT
zmian.
Wiem już, jak działają łączenia, chcę tylko wiedzieć, czy istnieją inne typy połączeń, czy też są to po prostu różne sposoby uzyskania tego samego wyniku.
Odpowiedzi:
(c) Znaleziono w G + „Wizualizacja danych”
lub zapoznaj się z poniższymi linkami, aby uzyskać dobry przegląd:
http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
źródło
cross join
, co daje iloczyn kartezjański.There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Opierając się na twoim komentarzu, proste definicje każdego typu najlepiej znaleźć w W3Schools Pierwsza linia każdego typu zawiera krótkie wyjaśnienie typu łączenia
KONIEC EDYCJI
W skrócie, podany przez ciebie przykład oddzielony przecinkami
polega na zaznaczaniu każdego rekordu z tabel a i b przecinkami oddzielającymi tabele, można tego użyć również w kolumnach takich jak
Następnie pobiera poinstruowane informacje w wierszu, w którym w przykładzie kolumny b.id i a.beeId pasują do siebie. W twoim przykładzie otrzyma wszystkie informacje z tabel a i b, gdzie b.id jest równe a.beeId. W moim przykładzie otrzyma wszystkie informacje z tabeli b i tylko informacje z kolumny a.beeName, gdy b.id jest równe a.beeId. Zauważ, że istnieje również klauzula AND, która pomoże zawęzić wyniki.
Aby zapoznać się z prostymi samouczkami i objaśnieniami dotyczącymi łączenia mySQL i łączenia lewostronnego, zapoznaj się z samouczkami Tizag dotyczącymi mySQL. Możesz również odwiedzić stronę internetową Keitha J. Browna, aby uzyskać więcej informacji na temat połączeń, które również są całkiem dobre.
mam nadzieję, że to Ci pomoże
źródło
Mam 2 takie tabele:
INNER JOIN dba o oba stoły
INNER JOIN dba o obie tabele, więc otrzymujesz wiersz tylko wtedy, gdy obie tabele mają jeden. Jeśli jest więcej niż jedna pasująca para, otrzymasz wiele wierszy.
Nie ma znaczenia dla INNER JOIN, jeśli odwrócisz kolejność, ponieważ zależy to na obu tabelach:
Otrzymujesz te same wiersze, ale kolumny są w innej kolejności, ponieważ wspomnieliśmy o tabelach w innej kolejności.
LEFT JOIN dba tylko o pierwszy stół
LEFT JOIN dba o pierwszą tabelę, którą mu podasz, i nie przejmuje się zbytnio drugą, więc zawsze otrzymujesz wiersze z pierwszej tabeli, nawet jeśli nie ma odpowiadającego wiersza w drugiej:
Powyżej możesz zobaczyć wszystkie wiersze tabeli table_a, mimo że niektóre z nich nie pasują do niczego w tabeli b, ale nie wszystkie wiersze tabeli table_b - tylko te, które pasują do czegoś w tabeli table_a.
Jeśli odwrócimy kolejność tabel, LEFT JOIN zachowuje się inaczej:
Teraz otrzymujemy wszystkie wiersze tabeli table_b, ale tylko pasujące wiersze tabeli table_a.
RIGHT JOIN dba tylko o drugi stół
a RIGHT JOIN b
dostajesz dokładnie te same wiersze, cob LEFT JOIN a
. Jedyną różnicą jest domyślna kolejność kolumn.To są te same rzędy
table_b LEFT JOIN table_a
, które widzieliśmy w sekcji LEFT JOIN.Podobnie:
To te same rzędy, co
table_a LEFT JOIN table_b
.Żadne połączenie w ogóle nie daje kopii wszystkiego
Bez klauzuli Join: Jeśli piszesz tabele bez klauzuli JOIN, oddzielone przecinkami, otrzymasz każdy wiersz pierwszej tabeli zapisany obok każdego wiersza drugiej tabeli, w każdej możliwej kombinacji:
(To jest z mojego wpisu na blogu Przykłady typów sprzężeń SQL )
źródło
Pełne sprzężenie zewnętrzne nie istnieje w mysql, może być konieczne użycie kombinacji złączenia lewego i prawego.
źródło