Jaka jest różnica między złączeniem naturalnym a złączeniem wewnętrznym?
Jaka jest różnica między złączeniem naturalnym a złączeniem wewnętrznym?
Odpowiedzi:
Jedną znaczącą różnicą między ŁĄCZENIEM WEWNĘTRZNYM a ŁĄCZENIEM NATURALNYM jest liczba zwracanych kolumn.
Rozważać:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
INNER JOIN
TABLEA i TableB na Kolumnie1 powróci
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
NATURAL JOIN
TABLEA i TableB na Kolumnie1 powróci:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
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.
i b.
części nie byłoby w nazwach kolumn, którą po prostu trzeba column1
, column2
, column1
, column3
według nagłówków. )
NATURAL JOIN
zrujnuje, dlaczego jest nieoczekiwany i w jakim świecie jesteś?
Customers
i Employees
, dołączanie EmployeeID
. Employees
ma również ManagerID
pole. Wszystko w porządku. Pewnego dnia ktoś dodaje ManagerID
pole do Customers
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)
i SELECT * FROM TableA NATURAL JOIN TableB
są równe, obie dają 3 kolumny.
natural left
albo natural 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:
NATURAL JOIN Checkouts
id
dołączenie jest wszechobecne i bezużyteczne; zwykle są to nazwy kluczy obcych tablename_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.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Jest taki sam jak...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Tym, czego nie można zrobić w formacie skrótu, są bardziej złożone połączenia ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()
? Średnia jest albo a NATURAL JOIN b
alboa JOIN b USING (c)
room_number
, podczas gdy twoje wewnętrzne sprzężenia będą miały dwie kolumny o nazwie room_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. Wynik NATURAL JOIN
dwóch tabel będzie miał kolumny zduplikowane według nazwy, a zatem nie będzie anonimowych kolumn. Podobnie, UNION CORRESPONDING
i EXCEPT CORRESPONDING
zostały dostarczone, aby rozwiązać zależność SQL od kolejności kolumn w starszej UNION
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 gdyby NATURAL 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życiu INNER JOIN
i projection ( SELECT
), prawdą jest również, że każdy INNER JOIN
może być napisany przy użyciu produktu ( CROSS JOIN
) i ograniczenia ( WHERE
); ponadto zauważ, że NATURAL JOIN
między tabelami bez wspólnych nazw kolumn da ten sam wynik co CROSS JOIN
. Więc jeśli interesują Cię tylko wyniki, które są relacjami (a dlaczego nie ?!), to NATURAL JOIN
jest to jedyny potrzebny rodzaj łączenia. Jasne, to prawda, że z perspektywy projektowania języka skróty takie jak INNER 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:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** Relacyjne połączenie naturalne nie jest ekwiwalentem, jest projekcją jednego. - philipxy
NATURAL
Dołączyć to tylko krótki składni dla specyficznego INNER
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 przypadku OUTER
( LEFT
/ RIGHT
) lub CROSS
złączeń.
Zobacz sekcję equi-join na Wikipedii:
Naturalne sprzężenie oferuje dalszą specjalizację sprzężeń równorzędnych. Predykat łączenia powstaje niejawnie przez porównanie wszystkich kolumn w obu tabelach, które mają takie same nazwy kolumn w połączonych tabelach.Wynikowa połączona tabela zawiera tylko jedną kolumnę dla każdej pary kolumn o tej samej nazwie.
Większość ekspertów zgadza się, że NATURALNE DOŁĄCZENIA są niebezpieczne i dlatego zdecydowanie odradzają ich stosowanie. Niebezpieczeństwo wynika z nieumyślnego dodania nowej kolumny o nazwie takiej samej jak inna kolumna ...
Oznacza to, że wszystkie NATURAL
złączenia mogą być zapisywane jako INNER
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 do LEFT
i RIGHT
łączy się, i to samo dotyczy. NATURAL LEFT/RIGHT
Sprzężenie jest tylko krótką składnią dla konkretnego LEFT/RIGHT
sprzężenia.)
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
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óż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.
Łą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.
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
DOŁĄCZ DO WEWNĘTRZNEGO:
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
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.