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 JOINvon 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 JOINvon 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, column3wie die Überschriften. )
NATURAL JOINruinieren wird, warum es unerwartet ist und in welcher Welt du bist?
Customersund Employees, Beitritt auf EmployeeID. Employeeshat auch ein ManagerIDFeld. Alles ist gut. Dann, eines Tages, fügt jemand ManagerIDder CustomersTabelle 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 TableBgleich sind, sie geben beide 3 Spalten.
natural leftoder 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 ..."
ides 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 bodera 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 JOINSQL ist es, es einfacher zu machen, dem relationalen Modell treu zu bleiben. Das Ergebnis der NATURAL JOINbeiden Tabellen enthält Spalten, die nach Namen de-dupliziert wurden, daher keine anonymen Spalten. In ähnlicher Weise UNION CORRESPONDINGund EXCEPT CORRESPONDINGsind an Adresse SQL Abhängigkeit von Spaltenordnung in dem Legacy vorgesehen UNIONSyntax.
Wie bei allen Programmiertechniken erfordert es jedoch Disziplin, um nützlich zu sein. Eine Voraussetzung für einen Erfolg NATURAL JOINsind 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 VIEWs :)
Beachten Sie, dass SQL NATURAL JOINein Equi-Join ** ist. Dies ist jedoch kein Hindernis für die Nützlichkeit. Bedenken Sie, dass NATURAL JOINder einzige in SQL unterstützte Join-Typ relational vollständig ist .
Während es in der Tat wahr ist, dass jeder NATURAL JOINmit INNER JOINund projection ( SELECT) geschrieben werden kann , ist es auch wahr, dass jeder INNER JOINmit product ( CROSS JOIN) und einschränkung ( WHERE) geschrieben werden kann; Beachten Sie außerdem, dass eine NATURAL JOINZwischen-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 JOINder einzige Join-Typ, den Sie benötigen. Sicher, es ist wahr, dass aus Sicht des Sprachdesigns Abkürzungen wie INNER JOINund CROSS JOINihren 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 NATURALJoin 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 CROSSJoins.
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 NATURALVerknüpfungen können als INNERVerknüpfungen geschrieben werden (aber das Gegenteil ist nicht der Fall). Erstellen Sie dazu einfach das Prädikat explizit - z. B. USINGoder 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 NATURALSchlüsselwort kann auch auf LEFTund RIGHTJoins angewendet werden , und das Gleiche gilt. Ein NATURAL LEFT/RIGHTJoin 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.