Was ist der Unterschied zwischen einer natürlichen und einer inneren Verbindung?
Was ist der Unterschied zwischen einer natürlichen und einer inneren Verbindung?
Antworten:
Ein wesentlicher Unterschied zwischen INNER JOIN und NATURAL JOIN ist die Anzahl der zurückgegebenen Spalten.
Erwägen:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
Die INNER JOIN
von Tabelle A und Tabelle B in Spalte 1 werden zurückgegeben
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 |
+------------+-----------+----------+----------+
Die NATURAL JOIN
von Tabelle A und Tabelle B in Spalte 1 geben Folgendes zurück:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
Die wiederholte Spalte wird vermieden.
(AFAICT aus der Standardgrammatik können Sie die Verknüpfungsspalten in einer natürlichen Verknüpfung nicht angeben. Die Verknüpfung basiert ausschließlich auf Namen. Siehe auch Wikipedia .)
( Es gibt einen Cheat in der inneren Verknüpfung Ausgang; die a.
und b.
Teile , die nicht in den Spaltennamen sein würde, würden Sie gerade haben column1
, column2
, column1
, column3
wie die Überschriften. )
NATURAL JOIN
ruinieren wird, warum es unerwartet ist und in welcher Welt du bist?
Customers
und Employees
, Beitritt auf EmployeeID
. Employees
hat auch ein ManagerID
Feld. Alles ist gut. Dann, eines Tages, fügt jemand ManagerID
der Customers
Tabelle ein Feld hinzu . Ihr Join wird nicht unterbrochen (das wäre eine Gnade), sondern enthält jetzt ein zweites Feld und funktioniert falsch . Eine scheinbar harmlose Veränderung kann also etwas zerstören, das nur entfernt verwandt ist. SEHR SCHLECHT. Der einzige Vorteil einer natürlichen Verknüpfung besteht darin, ein wenig Tipparbeit zu sparen, und der Nachteil ist erheblich.
SELECT * FROM TableA INNER JOIN TableB USING (Column1)
4 Spalten gibt. Dies ist nicht korrekt , da SELECT * FROM TableA INNER JOIN TableB USING (Column1)
und SELECT * FROM TableA NATURAL JOIN TableB
gleich sind, sie geben beide 3 Spalten.
natural left
oder haben natural right
), bei dem davon ausgegangen wird, dass die Join-Kriterien dort sind, wo gleichnamige Spalten in beiden Tabellen übereinstimmenIch würde es vermeiden, natürliche Verbindungen wie die Pest zu verwenden, da natürliche Verbindungen sind:
NATURAL JOIN Checkouts
"sind nur möglich, wenn die Namenskonventionen für Datenbanken formal sind und durchgesetzt werden ..."
id
es allgegenwärtig und nutzlos ist, mitzumachen. übliche Fremdschlüsselnamen sind tablename_id
. Natürliche Verbindungen sind eine schlechte, schlechte, schlechte Idee.
Ein natürlicher Join ist nur eine Verknüpfung, um die Eingabe zu vermeiden. Dabei wird davon ausgegangen, dass der Join einfach ist und mit gleichnamigen Feldern übereinstimmt.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Ist das gleiche wie...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Was Sie mit dem Verknüpfungsformat jedoch nicht tun können, sind komplexere Verknüpfungen ...
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 ()
? Der Standard ist entweder a NATURAL JOIN b
odera JOIN b USING (c)
room_number
, während Ihre inneren Verknüpfungen zwei Spalten mit dem Namen haben room_number
.
SQL ist dem relationalen Modell in vielerlei Hinsicht nicht treu. Das Ergebnis einer SQL-Abfrage ist keine Beziehung, da sie möglicherweise Spalten mit doppelten Namen, anonymen (unbenannten) Spalten, doppelten Zeilen, Nullen usw. enthält. SQL behandelt Tabellen nicht als Beziehungen, da es auf der Spaltenreihenfolge usw. beruht.
Die Idee hinter NATURAL JOIN
SQL ist es, es einfacher zu machen, dem relationalen Modell treu zu bleiben. Das Ergebnis der NATURAL JOIN
beiden Tabellen enthält Spalten, die nach Namen de-dupliziert wurden, daher keine anonymen Spalten. In ähnlicher Weise UNION CORRESPONDING
und EXCEPT CORRESPONDING
sind an Adresse SQL Abhängigkeit von Spaltenordnung in dem Legacy vorgesehen UNION
Syntax.
Wie bei allen Programmiertechniken erfordert es jedoch Disziplin, um nützlich zu sein. Eine Voraussetzung für einen Erfolg NATURAL JOIN
sind konsistent benannte Spalten, da Verknüpfungen für Spalten mit demselben Namen impliziert werden (es ist eine Schande, dass die Syntax zum Umbenennen von Spalten in SQL ausführlich ist, der Nebeneffekt jedoch darin besteht, die Disziplin beim Benennen von Spalten in Basistabellen und zu fördern VIEW
s :)
Beachten Sie, dass SQL NATURAL JOIN
ein Equi-Join ** ist. Dies ist jedoch kein Hindernis für die Nützlichkeit. Bedenken Sie, dass NATURAL JOIN
der einzige in SQL unterstützte Join-Typ relational vollständig ist .
Während es in der Tat wahr ist, dass jeder NATURAL JOIN
mit INNER JOIN
und projection ( SELECT
) geschrieben werden kann , ist es auch wahr, dass jeder INNER JOIN
mit product ( CROSS JOIN
) und einschränkung ( WHERE
) geschrieben werden kann; Beachten Sie außerdem, dass eine NATURAL JOIN
Zwischen-Tabelle ohne gemeinsame Spaltennamen das gleiche Ergebnis liefert wie CROSS JOIN
. Wenn Sie also nur an Ergebnissen interessiert sind, die Beziehungen sind (und warum nicht?!), Ist dies NATURAL JOIN
der einzige Join-Typ, den Sie benötigen. Sicher, es ist wahr, dass aus Sicht des Sprachdesigns Abkürzungen wie INNER JOIN
und CROSS JOIN
ihren Wert haben, aber auch bedenken, dass fast jede SQL-Abfrage auf 10 syntaktisch unterschiedliche, aber semantisch äquivalente Arten geschrieben werden kann, und dies macht SQL-Optimierer so schwierig entwickeln.
Hier sind einige Beispielabfragen (unter Verwendung der üblichen Teile- und Lieferantendatenbank ), die semantisch äquivalent sind:
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;
** Relational Natural Join ist kein Äquijoin, sondern eine Projektion von einem. - philipxy
Ein NATURAL
Join ist nur eine kurze Syntax für einen bestimmten INNER
Join - oder "Equi-Join" - und sobald die Syntax entpackt ist, repräsentieren beide dieselbe relationale Algebra-Operation. Es ist keine "andere Art" von Joins, wie im Fall von OUTER
( LEFT
/ RIGHT
) oder CROSS
Joins.
Siehe den Equi-Join- Abschnitt auf Wikipedia:
Ein natürlicher Join bietet eine weitere Spezialisierung von Equi-Joins. Das Verknüpfungsprädikat entsteht implizit durch Vergleichen aller Spalten in beiden Tabellen , die in den verknüpften Tabellen dieselben Spaltennamen haben . Die resultierende verknüpfte Tabelle enthält nur eine Spalte für jedes Paar gleichnamiger Spalten.
Die meisten Experten sind sich einig, dass NATURAL JOINs gefährlich sind und daher von ihrer Verwendung dringend abraten. Die Gefahr besteht darin, versehentlich eine neue Spalte hinzuzufügen, die den gleichen Namen wie eine andere Spalte hat ...
Das heißt, alle NATURAL
Verknüpfungen können als INNER
Verknüpfungen geschrieben werden (aber das Gegenteil ist nicht der Fall). Erstellen Sie dazu einfach das Prädikat explizit - z. B. USING
oder ON
- und wählen Sie, wie Jonathan Leffler betonte, die gewünschten Ergebnismengenspalten aus, um bei Bedarf "Duplikate" zu vermeiden.
Viel Spaß beim Codieren.
(Das NATURAL
Schlüsselwort kann auch auf LEFT
und RIGHT
Joins angewendet werden , und das Gleiche gilt. Ein NATURAL LEFT/RIGHT
Join ist nur eine kurze Syntax für einen bestimmten LEFT/RIGHT
Join.)
Natürliche Verknüpfung: Dies ist eine Kombination oder ein kombiniertes Ergebnis aller Spalten in den beiden Tabellen. Es werden alle Zeilen der ersten Tabelle in Bezug auf die zweite Tabelle zurückgegeben.
Innerer Join: Dieser Join funktioniert nur, wenn einer der Spaltennamen in zwei Tabellen sxame sein soll
Bei einem natürlichen Join werden 2 Tabellen auf der Grundlage aller gemeinsamen Spalten verbunden.
gemeinsame Spalte: ist eine Spalte, die in beiden Tabellen denselben Namen hat + in beiden Tabellen kompatible Datentypen hat. Sie können nur den Operator = verwenden
Bei einem Inner Join werden 2 Tabellen auf der Grundlage der in der ON-Klausel genannten gemeinsamen Spalten verbunden.
gemeinsame Spalte: ist eine Spalte mit kompatiblen Datentypen in beiden Tabellen, die jedoch nicht denselben Namen haben müssen. Sie können wie nur jeden Vergleich Operator =
, <=
, >=
, <
, >
,<>
Der Unterschied besteht darin, dass in der inneren (equi / default) Verknüpfung und der natürlichen Verknüpfung, die in der gemeinsamen Spalte "natuarl join" angezeigt werden, der Gewinn in einer Zeit angezeigt wird, während in der inneren / gleichwertigen / standardmäßigen / einfachen Verknüpfung die gemeinsame Spalte doppelt angezeigt wird.
Innere Verbindung und natürliche Verbindung sind fast gleich, aber es gibt einen kleinen Unterschied zwischen ihnen. Der Unterschied besteht darin, dass bei der natürlichen Verknüpfung keine Bedingung angegeben werden muss, bei der inneren Verknüpfung jedoch die Bedingung obligatorisch ist. Wenn wir die Bedingung in der inneren Verknüpfung angeben, sind die resultierenden Tabellen wie ein kartesisches Produkt.
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)
INNER JOIN:
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)
Innerer Join, Join zwei Tabellen, bei denen der Spaltenname identisch ist.
Natürliche Verknüpfung, Verknüpfung zweier Tabellen, bei denen Spaltenname und Datentyp identisch sind.