Unterschied zwischen natürlicher und innerer Verbindung


197

Was ist der Unterschied zwischen einer natürlichen und einer inneren Verbindung?


3
Diese Frage ist kein Duplikat der anderen, da es sich um INNER vs NATURAL-Joins handelt, die in der anderen nicht behandelt werden.

1
Zu einer Zeit wurde dies als Duplikat von Was ist der Unterschied zwischen linken, rechten, äußeren und inneren Verknüpfungen geschlossen , aber diese Frage befasst sich nicht mit dem Unterschied zwischen inneren Verknüpfungen und natürlichen Verknüpfungen.
Jonathan Leffler

Antworten:


249

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. )


2
Ich habe zwei Tabellen TabelleA (Spalte1, Spalte2) und TabelleB (Spalte2, Spalte3).
2 8

16
Das Reduzieren von Spalten in der Ausgabe ist der am wenigsten wichtige Aspekt einer natürlichen Verknüpfung. Die Dinge, die Sie wissen müssen, sind (A) es verbindet sich automatisch mit gleichnamigen Feldern und (B) es wird Ihr s *** auffrischen, wenn Sie es am wenigsten erwarten. In meiner Welt ist die Verwendung einer natürlichen Verbindung ein Grund für die Entlassung.

8
@ JonofAllTrades Kannst du mehr darüber erklären, was genau NATURAL JOINruinieren wird, warum es unerwartet ist und in welcher Welt du bist?
Bryson

35
Dies wird in der Antwort von user166390 etwas angesprochen. Angenommen , Sie haben eine natürliche Verbindung zwischen 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.

2
@ Jonathan, In Bezug auf Ihre Antwort haben Sie angegeben, dass 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.
Pacerier

81
  • Ein innerer Join ist einer, bei dem die übereinstimmende Zeile in der verknüpften Tabelle erforderlich ist, damit eine Zeile aus der ersten Tabelle zurückgegeben wird
  • Eine äußere Verknüpfung ist eine Verknüpfung, bei der die übereinstimmende Zeile in der verknüpften Tabelle nicht erforderlich ist, damit eine Zeile aus der ersten Tabelle zurückgegeben wird
  • Ein natürlicher Join ist ein Join (Sie können entweder natural leftoder haben natural right), bei dem davon ausgegangen wird, dass die Join-Kriterien dort sind, wo gleichnamige Spalten in beiden Tabellen übereinstimmen

Ich würde es vermeiden, natürliche Verbindungen wie die Pest zu verwenden, da natürliche Verbindungen sind:

  • Nicht Standard-SQL [SQL 92] und daher nicht portabel, nicht besonders lesbar (von den meisten SQL-Codierern) und möglicherweise nicht von verschiedenen Tools / Bibliotheken unterstützt
  • nicht informativ; Sie können nicht erkennen, an welchen Spalten verbunden wird, ohne auf das Schema zu verweisen
  • Ihre Join-Bedingungen sind unsichtbar anfällig für Schemaänderungen. Wenn mehrere natürliche Join-Spalten vorhanden sind und eine solche Spalte aus einer Tabelle entfernt wird, wird die Abfrage weiterhin ausgeführt, jedoch wahrscheinlich nicht korrekt, und diese Verhaltensänderung wird stummgeschaltet
  • kaum die Mühe wert; Sie sparen nur etwa 10 Sekunden beim Tippen

2
Ich denke, dass links / rechts für äußere erwähnt werden sollte (da äußere überhaupt erwähnt wird). Aber ansonsten schön und prägnant: Es fehlen nur die hübschen Beispiel-SQL-Datensatzdiagramme.

2
NATÜRLICH LINKS und NATÜRLICH RECHTS existieren ebenfalls. Aber ja, meide sie trotzdem.
MatBailie

1
@Bohemian, In Bezug auf "Vermeiden Sie sie wie die Pest" gibt es echte Anwendungsfälle für natürliche Verbindungen, bei denen sie nützlich sind. mariadb.com/kb/en/sql-99/natural-join "... Die lässig aussehenden" Bücher NATURAL JOIN Checkouts"sind nur möglich, wenn die Namenskonventionen für Datenbanken formal sind und durchgesetzt werden ..."
Pacerier

2
@sqlvovel Es ist viel falsch mit Ihrem Kommentar, insbesondere ist es falsch. Verknüpfungsspalten können nicht "in einer Auswahlliste angegeben" werden. Die Definition eines natürlichen Joins besteht darin , sich * allen gleichnamigen Spalten * anzuschließen . Aus dem MySQL-Dokument: Der NATURAL [LEFT] JOIN zweier Tabellen ist so definiert, dass er semantisch einem INNER JOIN oder einem LEFT JOIN mit einer USING-Klausel entspricht, die alle Spalten benennt, die in beiden Tabellen vorhanden sind. . Und noch etwas - in der Praxis ist es nutzlos, weil ides allgegenwärtig und nutzlos ist, mitzumachen. übliche Fremdschlüsselnamen sind tablename_id. Natürliche Verbindungen sind eine schlechte, schlechte, schlechte Idee.
Böhmisch

2
Meine Abfrage enthält keine doppelt zurückgegebenen Spalten. Einer der Vorteile der NJ-Semantik besteht darin, dass doppelte Spalten niemals zurückgegeben werden. Ihre vorherige Abfrage war auch "weniger sicher" als meine, da sie fehlschlagen würde, wenn eine Spalte mit dem Namen "a" zu t2 hinzugefügt würde (da die Nicht-Alias-Verknüpfungsbedingung nicht eindeutig ist). Ich vermute, dass Ihre Vorurteile gegenüber NJ auf der Tatsache beruhen, dass Sie es nicht in einem Produkt ausprobiert haben, in dem Standard-SQL ordnungsgemäß unterstützt wird. Die Frage hier ist über SQL, nicht MySQL - ganz andere Dinge. Sie haben Ihre Antwort immer noch nicht korrigiert, weil sie nicht dem Standard entspricht.
Nvogel

27

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)

2
@ JonathanLeffler - In MySQL sicherlich.
MatBailie

3
OK - interessant. Ich habe gefragt, weil der SQL-Standard dies nicht zuzulassen scheint (Erweiterungen sind jedoch immer möglich).
Jonathan Leffler

Welches DBMS erlaubt diese nicht standardmäßige Syntax : NATURAL JOIN ... USING ()? Der Standard ist entweder a NATURAL JOIN bodera JOIN b USING (c)
ypercubeᵀᴹ

1
"Nur eine Abkürzung, um das Tippen zu vermeiden" ist eine falsche Darstellung. Das wichtigste Merkmal ist, dass es nicht zu doppelten Spalten führt.
Tag, wenn

... zum Beispiel hat das Ergebnis Ihrer Abfrage, die eine natürliche Verknüpfung verwendet, nur eine Spalte mit dem Namen room_number, während Ihre inneren Verknüpfungen zwei Spalten mit dem Namen haben room_number.
Tag, wenn

13

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


Relational Natural Join ist kein Äquijoin, sondern eine Projektion von einem. SQL Natural Join ist ein SQL Equijoin (Duplikate möglich) - es wird in Bezug auf Inner Join mit definiert.
philipxy

@philipxy: Danke, ich habe Änderungen vorgenommen. Bitte zögern Sie nicht, diese oder eine meiner Antworten auf falsche Angaben und Missverständnisse zu bearbeiten. Ich lerne immer noch von Ihnen :)
onedaywhen

9

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.)


2
"NATURAL join ist nur eine kurze Syntax für [snipped]" equi-join "- und sobald die Syntax entpackt ist, repräsentieren beide dieselbe relationale Algebra" - Sie haben Recht: Das gilt für die relationale Algebra, aber Ihre Antwort bricht zusammen danach zB "Die meisten Experten sind sich einig, dass NATURAL JOINs gefährlich sind und daher stark von ihrer Verwendung abraten" - welche Experten in der relationalen Algebra sagen das?!
Tag, wenn

2

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


3
Ich denke nicht, dass Ihre Antwort klar genug ist und eine große Umschreibung erfordern würde, um sie zu beheben.
Tag, wenn

0

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 =, <=, >=, <, >,<>


-2

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.


-2

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.


Warum müssen keine Beitrittsbedingungen angegeben werden? Unter welchen Umständen würde die Angabe von Bedingungen in einer inneren Verbindung zu so etwas wie einem kartesischen Produkt führen?
Tag, wenn

Äußere und innere Verknüpfung als "fast gleich" zu bezeichnen, ist imho eine leichte Untertreibung. Vielleicht können Sie Ihre Bewertung näher erläutern?
TMOTTM

-3
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)

-4

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.


Das ist völlig falsch. A NATURAL JOIN(wie mehrere Leute vor Jahren betonten) ist eines, bei dem die Spaltennamen gleich sind. Der Datentyp muss nicht identisch sein. Die für ein Feld verwendeten Felder INNER JOINmüssen nicht denselben Namen haben.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.