Jaka jest różnica między złączeniem naturalnym a złączeniem wewnętrznym?
sql
join
natural-join
kowal
źródło
źródło
Odpowiedzi:
Jedną znaczącą różnicą między ŁĄCZENIEM WEWNĘTRZNYM a ŁĄCZENIEM NATURALNYM jest liczba zwracanych kolumn.
Rozważać:
INNER JOIN
TABLEA i TableB na Kolumnie1 powróciNATURAL JOIN
TABLEA i TableB na Kolumnie1 powróci:Powtarzana kolumna jest unikana.
(AFAICT ze standardowej gramatyki, nie można określić kolumn łączących w złączeniu naturalnym; łączenie jest ściśle oparte na nazwie. Zobacz także Wikipedia .)
( Jest oszustem w wewnętrzny dołączyć wyjście, a
a.
ib.
części nie byłoby w nazwach kolumn, którą po prostu trzebacolumn1
,column2
,column1
,column3
według nagłówków. )źródło
NATURAL JOIN
zrujnuje, dlaczego jest nieoczekiwany i w jakim świecie jesteś?Customers
iEmployees
, dołączanieEmployeeID
.Employees
ma równieżManagerID
pole. Wszystko w porządku. Pewnego dnia ktoś dodajeManagerID
pole doCustomers
stołu. Twoje dołączenie się nie zepsuje (byłoby to miłosierdziem), zamiast tego będzie zawierać drugie pole i będzie działać niepoprawnie . Tak więc pozornie nieszkodliwa zmiana może złamać coś, co jest tylko odlegle powiązane. BARDZO ŹLE. Jedynym minusem naturalnego łączenia jest oszczędność trochę pisania, a wadą jest znaczna.SELECT * FROM TableA INNER JOIN TableB USING (Column1)
daje 4 kolumny. To nie jest poprawne, ponieważSELECT * FROM TableA INNER JOIN TableB USING (Column1)
iSELECT * FROM TableA NATURAL JOIN TableB
są równe, obie dają 3 kolumny.natural left
albonatural right
), który zakłada dołączyć kryteria być tam, gdzie o tej samej nazwie kolumny w tabeli zarówno meczuUnikałbym używania naturalnych połączeń, takich jak dżuma, ponieważ naturalne połączenia to:
Niestandardem SQL [SQL 92], azatem nieprzenośne nie jest szczególnie odczytu (najwięcej koderów SQL) i ewentualnie nie są obsługiwane przez różne narzędzia / bibliotekźródło
NATURAL JOIN Checkouts
id
dołączenie jest wszechobecne i bezużyteczne; zwykle są to nazwy kluczy obcychtablename_id
. Naturalne połączenia to zły, zły, zły pomysł.Naturalne łączenie to tylko skrót, aby uniknąć pisania, przy założeniu, że łączenie jest proste i pasuje do pól o tej samej nazwie.
Jest taki sam jak...
Tym, czego nie można zrobić w formacie skrótu, są bardziej złożone połączenia ...
źródło
NATURAL JOIN ... USING ()
? Średnia jest alboa NATURAL JOIN b
alboa JOIN b USING (c)
room_number
, podczas gdy twoje wewnętrzne sprzężenia będą miały dwie kolumny o nazwieroom_number
.SQL na wiele sposobów nie jest wierny modelowi relacyjnemu. Wynik zapytania SQL nie jest relacją, ponieważ może mieć kolumny ze zduplikowanymi nazwami, kolumny „anonimowe” (bez nazw), duplikaty wierszy, wartości zerowe itp. SQL nie traktuje tabel jako relacji, ponieważ opiera się na kolejności kolumn itp.
Ideą
NATURAL JOIN
SQL jest ułatwienie bycia bardziej wiernym modelowi relacyjnemu. WynikNATURAL JOIN
dwóch tabel będzie miał kolumny zduplikowane według nazwy, a zatem nie będzie anonimowych kolumn. Podobnie,UNION CORRESPONDING
iEXCEPT CORRESPONDING
zostały dostarczone, aby rozwiązać zależność SQL od kolejności kolumn w starszejUNION
składni.Jednak, podobnie jak w przypadku wszystkich technik programowania, dyscyplina jest przydatna. Jednym warunkiem sukcesu
NATURAL JOIN
jest spójna nazwa kolumn, ponieważ sprzężenia są implikowane w kolumnach o tych samych nazwach (szkoda, że składnia zmiany nazw kolumn w SQL jest pełna, ale efektem ubocznym jest zachęcenie do dyscypliny przy nazywaniu kolumn w tabelach podstawowych iVIEW
s :)Zauważ, że SQL
NATURAL JOIN
jest sprzężeniem równorzędnym **, jednak nie oznacza to braku użyteczności. Weź pod uwagę, że gdybyNATURAL JOIN
jedyny typ łączenia obsługiwany w SQL byłby nadal relatywnie kompletny .Chociaż prawdą jest, że każdy
NATURAL JOIN
może być napisany przy użyciuINNER JOIN
i projection (SELECT
), prawdą jest również, że każdyINNER JOIN
może być napisany przy użyciu produktu (CROSS JOIN
) i ograniczenia (WHERE
); ponadto zauważ, żeNATURAL JOIN
między tabelami bez wspólnych nazw kolumn da ten sam wynik coCROSS JOIN
. Więc jeśli interesują Cię tylko wyniki, które są relacjami (a dlaczego nie ?!), toNATURAL JOIN
jest to jedyny potrzebny rodzaj łączenia. Jasne, to prawda, że z perspektywy projektowania języka skróty takie jakINNER JOIN
iCROSS JOIN
mają swoją wartość, ale należy również wziąć pod uwagę, że prawie każde zapytanie SQL może być napisane na 10 różnych składniowo, ale semantycznie równoważnych, a to sprawia, że optymalizatory SQL są tak trudne rozwijać.Oto kilka przykładowych zapytań (wykorzystujących zwykłą bazę danych części i dostawców ), które są semantycznie równoważne:
** Relacyjne połączenie naturalne nie jest ekwiwalentem, jest projekcją jednego. - philipxy
źródło
NATURAL
Dołączyć to tylko krótki składni dla specyficznegoINNER
przyłączenia - czy „equi-join” - i po składnia jest rozpakowany, obaj reprezentują tę samą operację algebry relacyjnej. Nie jest to „inny rodzaj” łączenia, jak w przypadkuOUTER
(LEFT
/RIGHT
) lubCROSS
złączeń.Zobacz sekcję equi-join na Wikipedii:
Oznacza to, że wszystkie
NATURAL
złączenia mogą być zapisywane jakoINNER
złączenia (ale odwrotność nie jest prawdą). Aby to zrobić, po prostu utwórz predykat jawnie - np.USING
LubON
- i, jak wskazał Jonathan Leffler, wybierz żądane kolumny zestawu wyników, aby w razie potrzeby uniknąć „duplikatów”.Szczęśliwego kodowania.
(Słowo
NATURAL
kluczowe może być również zastosowane doLEFT
iRIGHT
łączy się, i to samo dotyczy.NATURAL LEFT/RIGHT
Sprzężenie jest tylko krótką składnią dla konkretnegoLEFT/RIGHT
sprzężenia.)źródło
Naturalne łączenie: Jest to kombinacja lub wynik wszystkich kolumn w dwóch tabelach. Zwróci wszystkie wiersze pierwszej tabeli w odniesieniu do drugiej tabeli.
Sprzężenie wewnętrzne: To sprzężenie będzie działać, chyba że dowolna z nazw kolumn będzie sxame w dwóch tabelach
źródło
Naturalne łączenie polega na łączeniu 2 tabel na podstawie wszystkich wspólnych kolumn.
wspólna kolumna: to kolumna o tej samej nazwie w obu tabelach + zgodnych typów danych w obu tabelach. Możesz użyć tylko = operator
Łączenie wewnętrzne polega na łączeniu 2 tabel na podstawie wspólnych kolumn wymienionych w klauzuli ON.
wspólna kolumna: jest kolumną, która ma kompatybilne typy danych w obu tabelach, ale nie musi mieć tej samej nazwy. Można używać tylko dowolnego operatora porównania jak
=
,<=
,>=
,<
,>
,<>
źródło
różnica polega na tym, że w przypadku połączenia wewnętrznego (equi / default) i łączenia naturalnego, które w łączeniu natuarl wygrana wspólna kolumna zostanie wyświetlona za jednym razem, ale połączenie wewnętrzne / equi / default / simple wspólna kolumna będzie wyświetlana podwójnie.
źródło
Łączenie wewnętrzne i łączenie naturalne są prawie takie same, ale istnieje między nimi niewielka różnica. Różnica polega na tym, że w sprzężeniu naturalnym nie trzeba określać warunku, ale w sprzężeniu wewnętrznym warunek jest obowiązkowy. Jeśli określimy warunek w złączeniu wewnętrznym, wynikowe tabele są jak iloczyn kartezjański.
źródło
DOŁĄCZ DO WEWNĘTRZNEGO:
źródło
Złączenie wewnętrzne, dołącz do dwóch tabel, w których nazwa kolumny jest taka sama.
Naturalne łączenie, dołącz do dwóch tabel, w których nazwa kolumny i typy danych są takie same.
źródło
NATURAL JOIN
(jak wskazało kilka lat temu) to takie, w którym nazwy kolumn są takie same. Typ danych nie musi być taki sam. Pola używane doINNER JOIN
potrzeby nie muszą mieć tej samej nazwy.