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 JOINTABLEA 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 JOINTABLEA 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, column3według nagłówków. )
NATURAL JOINzrujnuje, dlaczego jest nieoczekiwany i w jakim świecie jesteś?
Customersi Employees, dołączanie EmployeeID. Employeesma również ManagerIDpole. Wszystko w porządku. Pewnego dnia ktoś dodaje ManagerIDpole do Customersstoł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 TableBsą równe, obie dają 3 kolumny.
natural leftalbo 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
iddołą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 balboa 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 JOINSQL jest ułatwienie bycia bardziej wiernym modelowi relacyjnemu. Wynik NATURAL JOINdwóch tabel będzie miał kolumny zduplikowane według nazwy, a zatem nie będzie anonimowych kolumn. Podobnie, UNION CORRESPONDINGi EXCEPT CORRESPONDINGzostały dostarczone, aby rozwiązać zależność SQL od kolejności kolumn w starszej UNIONskładni.
Jednak, podobnie jak w przypadku wszystkich technik programowania, dyscyplina jest przydatna. Jednym warunkiem sukcesu NATURAL JOINjest 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 JOINjest sprzężeniem równorzędnym **, jednak nie oznacza to braku użyteczności. Weź pod uwagę, że gdyby NATURAL JOINjedyny typ łączenia obsługiwany w SQL byłby nadal relatywnie kompletny .
Chociaż prawdą jest, że każdy NATURAL JOINmoże być napisany przy użyciu INNER JOINi projection ( SELECT), prawdą jest również, że każdy INNER JOINmoże być napisany przy użyciu produktu ( CROSS JOIN) i ograniczenia ( WHERE); ponadto zauważ, że NATURAL JOINmię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 JOINjest to jedyny potrzebny rodzaj łączenia. Jasne, to prawda, że z perspektywy projektowania języka skróty takie jak INNER JOINiCROSS 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
NATURALDołą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 CROSSzłą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 NATURALzłączenia mogą być zapisywane jako INNERzłączenia (ale odwrotność nie jest prawdą). Aby to zrobić, po prostu utwórz predykat jawnie - np. USINGLubON - i, jak wskazał Jonathan Leffler, wybierz żądane kolumny zestawu wyników, aby w razie potrzeby uniknąć „duplikatów”.
Szczęśliwego kodowania.
(Słowo NATURALkluczowe może być również zastosowane do LEFTi RIGHTłączy się, i to samo dotyczy. NATURAL LEFT/RIGHTSprzęż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.