Jestem nowy w SQL i chciałem wiedzieć, jaka jest różnica między tymi dwoma JOIN
typami?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
Kiedy powinienem użyć jednego lub drugiego?
Odpowiedzi:
W pierwszym przykładzie zwrócisz listę użytkowników i numerów telefonów tylko wtedy, gdy dla użytkownika istnieje co najmniej jeden rekord telefoniczny.
W drugim przykładzie zwrócisz listę wszystkich użytkowników oraz wszelkie dane telefoniczne, jeśli są oni dostępni (jeśli nie są dostępni, otrzymasz
NULL
wartości telefoniczne).źródło
Za każdym razem, gdy ktoś zadaje to pytanie, pojawia się odpowiedź: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
Mam nadzieję, że pomoże ci to zrozumieć,
źródło
Sprzężenia wewnętrznego zostaje przywrócone rzędów, które mogą być łączone na podstawie łączą kryteriów.
Sprzężenie zewnętrzne zwraca te i wszystkie wiersze ...
... z pierwszego stołu dla lewego złączenia
... z drugiego stołu dla prawego złączenia
... z obu tabel dla pełnego złączenia
Wybór, kiedy użyć jednego lub drugiego, jest kwestią ustalenia, jakich danych potrzebujesz. Na przykład, jeśli potrzebujesz tylko rekordów zawierających identyfikatory użytkownika z telefonu, które pasują do identyfikatora użytkownika, użyj sprzężenia wewnętrznego. Jeśli chcesz również dołączyć wiersze od użytkownika, które nie mają pasującego wpisu telefonicznego, odpowiednie byłoby lewe łączenie.
Aby uzyskać więcej informacji zobacz to pytanie na StackOverflow .
źródło
Jeśli masz 2 tabele jak poniżej:
Jeśli użyjesz funkcji dołączenia wewnętrznego, otrzymasz:
Jeśli użyjesz Full Outer Join, otrzymasz:
Jeśli użyjesz Left Outer Join, otrzymasz:
źródło
Łączenie zewnętrzne jest wyraźnie zaprojektowane tak, aby dawało w wyniku wartości zerowe i dlatego należy go ogólnie unikać. Mówiąc relatywnie, jest to rodzaj małżeństwa ze strzelbą: zmusza stoły do pewnego rodzaju związku - tak, mam na myśli związek, a nie przyłączanie się - nawet gdy dane tabele nie spełniają zwykłych wymagań dotyczących związku. Robi to w rzeczywistości, wypełniając jedną lub obie tabele zerami przed wykonaniem unii, dzięki czemu w końcu są one zgodne z tymi zwykłymi wymaganiami. Ale nie ma powodu, dla którego tego wypełnienia nie należy wykonywać przy użyciu odpowiednich wartości zamiast wartości zerowych, jak w tym przykładzie:
Alternatywnie ten sam wynik można uzyskać za pomocą operatora zewnętrznego łączenia SQL w połączeniu z
COALESCE
, jak tutaj:Uwaga na temat sprzężenia zewnętrznego (4.6) w „Teorii SQL i relacji: jak pisać dokładny kod SQL” według CJ Date
źródło
Łączenie wewnętrzne to łączenie, w którym wyświetlane są tylko wyniki, w których klucze znajdują się w obu tabelach. Sprzężenie zewnętrzne wyświetli wyniki dla wszystkich kluczy w jednej tabeli, lewe złączenie od pierwszego i prawe złączenie od drugiego. Na przykład:
Załóżmy, że tabela 1 zawiera następujące pary kluczy podstawowych i danych: (1, a), (2, b), (3, c)
Powiedzmy również, że tabela 2 ma następujące pary kluczy podstawowych i danych: (1, zabawa), (3, puszka), (4, zdarzenie)
Zatem wewnętrzne sprzężenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (ze wspólnym kluczem podstawowym jako pierwszym, drugim elementem pierwszego stołu drugim i drugim elementem drugiego stołu trzecim): (1, a, fun), ( 3, c, puszka)
Lewe zewnętrzne połączenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (taki sam format jak powyżej): (1, a, fun), (2, b, NULL), (3, c, can)
Prawe zewnętrzne połączenie tabeli 1 z tabelą 2 na kluczach podstawowych dałoby następujące wynikowe tryplety (taki sam format jak powyżej): (1, a, fun), (3, c, can), (4, NULL, happ)
Mam nadzieję, że to dobrze wyjaśnia tę koncepcję.
źródło
Pozwól mi spróbować opisać to nieco bardziej intuicyjnie.
Łączenie wewnętrzne pokazuje użytkowników, którzy mają jeden lub więcej telefonów wraz z ich numerami telefonicznymi.
Lewy zewnętrzny łącznik dodatkowo wymienia tych „użytkowników”, którzy nie mają telefonu.
źródło
Ponieważ zapytałeś, kiedy użyć czego, oto scenariusz z zapytaniami - wybierz, którego użyć w zależności od wymagań.
Dane:
Użytkownicy tabeli mają 10 rekordów. Tabela Phoneno ma 6 rekordów (z relacją 1: 1, co oznacza, że wpis w PhoneNo będzie odnosił się tylko do jednego wpisu w Użytkownicy, a tylko jeden wpis w PhoneNo może odnosić się do danego wpisu w Użytkownicy).
Wymaganie 1: Pokaż wszystkim użytkownikom ich numery telefonów. Zignoruj użytkowników bez numeru telefonu.
Pytanie:
Wynik: pokazuje 6 użytkowników, którzy mają numer telefonu
Wymaganie 2: Pokaż wszystkim użytkownikom ich numer telefonu. Jeśli użytkownik nie ma wyświetlacza telefonu „Nie dotyczy” (niedostępne)
Pytanie:
Wynik:
Pokazuje wszystkie 10 rekordów
Uwaga: ifnull to składnia MySql do przekształcania wartości null. Użyłem tej funkcji, aby silnik db pokazywał „N / A”, gdy phonno ma wartość null. Poszukaj odpowiedniej funkcji, jeśli używasz innego DBMS. W SQL Server musisz użyć
CASE
instrukcji.Mam nadzieję, że to pomoże.
źródło