wake-up-neo.com

Unterschied zwischen natürlicher Verbindung und innerer Verbindung

Was ist der Unterschied zwischen einem natürlichen Join und einem inneren Join?

167
smith

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      |
+------------+----------+        +---------+----------+

Der INNER JOIN von TableA und TableB in Spalte1 wird zurückgegeben

SELECT * FROM TableA INNER JOIN TableB USING (Column1);
SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1;
+------------+-----------+---------------------+    
| a.Column1  | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1          |  2        | 1        |   3      |
+------------+-----------+----------+----------+

Der NATURAL JOIN von TableA und TableB in Spalte1 gibt 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 dem Namen. Siehe auch Wikipedia .)

( Die Ausgabe des Inner Join enthält einen Cheat. Die Teile a. und b. befinden sich nicht in den Spaltennamen. Sie hätten nur column1. , column2, column1, column3 als Überschriften. )

220
  • Ein inner - Join ist ein Join, bei dem die übereinstimmende Zeile in der verbundenen Tabelle erforderlich ist, damit eine Zeile aus der ersten Tabelle zurückgegeben werden kann
  • Eine outer - Verknüpfung ist eine Verbindung, bei der die übereinstimmende Zeile in der verbundenen Tabelle nicht ist, damit eine Zeile aus der ersten Tabelle zurückgegeben werden kann
  • Ein natural - Join ist ein Join (Sie können entweder natural left oder natural right haben), bei dem davon ausgegangen wird, dass die Join-Kriterien übereinstimmen, an denen gleichnamige Spalten in beiden Tabellen übereinstimmen

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

  • nicht Standard SQL [SQL 92] und deshalb 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, in welchen Spalten die Verknüpfung erfolgt, ohne sich auf das Schema zu beziehen
  • ihre Verknüpfungsbedingungen sind für Schemaänderungen unsichtbar anfällig. Wenn mehrere natürliche Verknüpfungsspalten vorhanden sind und eine solche Spalte aus einer Tabelle entfernt wird, wird die Abfrage zwar ausgeführt, aber wahrscheinlich nicht richtig und diese Verhaltensänderung wird nicht berücksichtigt
  • kaum die Mühe wert; Sie sparen nur etwa 10 Sekunden Eingabe
76
Bohemian

Ein natürlicher Join ist nur eine Abkürzung, um das Tippen zu vermeiden, mit der Annahme, dass der Join einfach ist und Feldern mit demselben Namen entspricht.

SELECT
  *
FROM
  table1
NATURAL JOIN
  table2
    USING (room_number)

Ist das gleiche wie...

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON table1.room_number = table2.room_number

Was Sie mit dem Verknüpfungsformat nicht tun können, sind jedoch 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)
23
MatBailie

SQL ist in vielerlei Hinsicht dem relationalen Modell nicht treu. Das Ergebnis einer SQL-Abfrage ist keine Relation, da sie Spalten mit doppelten Namen, "anonymen" (unbenannten) Spalten, doppelten Zeilen, Nullen usw. enthalten kann. SQL behandelt Tabellen nicht als Relationen, da sie auf der Reihenfolge der Spalten usw. beruhen.

Die Idee hinter NATURAL JOIN in SQL ist es, es einfacher zu machen, dem relationalen Modell treuer zu sein. Das Ergebnis von NATURAL JOIN von zwei Tabellen hat Spalten, die nach Namen de-dupliziert sind, also keine anonymen Spalten. In ähnlicher Weise werden UNION CORRESPONDING und EXCEPT CORRESPONDING bereitgestellt, um die Abhängigkeit von SQL von der Spaltenreihenfolge in der älteren UNION-Syntax zu berücksichtigen.

Wie bei allen Programmiertechniken muss jedoch Disziplin hilfreich sein. Eine Voraussetzung für einen erfolgreichen NATURAL JOIN sind konsistent benannte Spalten, da Joins für Spalten mit denselben Namen impliziert werden (schade, dass die Syntax für das Umbenennen von Spalten in SQL ausführlich ist. Der Nebeneffekt besteht jedoch darin, die Disziplin beim Benennen von Spalten in Basistabellen zu fördern und VIEWs :) 

Beachten Sie, dass ein NATURAL JOIN von SQL ein Equi-Join ** ist. Dies ist jedoch kein Hindernis für die Nützlichkeit. Wenn NATURAL JOIN der einzige in SQL unterstützte Join-Typ wäre, wäre dies immer noch relationally complete

Es ist zwar wahr, dass jeder NATURAL JOIN unter Verwendung von INNER JOIN und Projektion (SELECT) geschrieben werden kann, es ist jedoch auch wahr, dass jeder INNER JOIN unter Verwendung von Produkt (CROSS JOIN) und Einschränkung (WHERE) geschrieben werden kann. Beachten Sie außerdem, dass ein NATURAL JOIN zwischen Tabellen ohne gemeinsame Spaltennamen dasselbe Ergebnis wie CROSS JOIN ergibt. Wenn Sie also nur an Ergebnissen interessiert sind, die Beziehungen darstellen (und warum überhaupt nicht ?!), ist NATURAL JOIN der einzige Verbindungstyp, den Sie benötigen. Sicher, es ist wahr, dass aus der Sicht des Sprachdesigns Abkürzungen wie INNER JOIN und CROSS JOIN ihren Wert haben, aber auch berücksichtigen, dass fast jede SQL-Abfrage auf syntaktisch unterschiedliche, aber semantisch gleichwertige Weise geschrieben werden kann. Dies macht die SQL-Optimierer so sehr schwer zu entwickeln.

Hier einige Beispielabfragen (mit der üblichen Teile- und Lieferantendatenbank ), die semantisch gleichwertig 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' style
SELECT *
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

** Relationaler natürlicher Join ist kein Equijoin, es ist eine Projektion von einem. - philipxy 

11
onedaywhen

Ein NATURAL-Join ist nur eine kurze Syntax für einen bestimmten INNER-Join - oder "equi-join" - und nach dem Auspacken der Syntax beide repräsentieren dieselbe relationale Algebra-Operation. Es ist keine "andere Art" der Verknüpfung, wie im Fall von OUTER (LEFT/RIGHT) oder CROSS Verknüpfungen.

Siehe den Abschnitt equi-join auf Wikipedia:

Ein natürlicher Join bietet eine weitere Spezialisierung von Equi-Joins. Das Join-Prädikat entsteht implizit durch den Vergleich 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 raten daher dringend von ihrer Verwendung ab. Die Gefahr besteht darin, dass versehentlich eine neue Spalte mit dem gleichen Namen wie eine andere Spalte hinzugefügt wird ...

Das heißt, alle NATURAL Joins können als INNER Joins geschrieben werden (aber die Umkehrung ist nicht wahr). Erstellen Sie dazu einfach das Prädikat explizit - z. USING oder ON - und wählen Sie, wie Jonathan Leffler betont hat, die gewünschten Spalten der Ergebnismenge aus, um "Duplikate" zu vermeiden, falls dies gewünscht wird.

Fröhliches 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 ein spezifisch LEFT/RIGHT beitreten.)

8
user166390

Natural Join: Dies ist ein kombiniertes oder kombiniertes Ergebnis aller Spalten in den beiden Tabellen . Es werden alle Zeilen der ersten Tabelle in Bezug auf die zweite Tabelle zurückgegeben.

Inner Join: Dieser Join funktioniert nur, wenn einer der Spaltennamen in zwei Tabellen angegeben wird

2
Victor Bhatti

Bei einem Natural Join werden 2 Tabellen auf der Grundlage aller gemeinsamen Spalten verbunden.

allgemeine Spalte: ist eine Spalte, die in beiden Tabellen den gleichen Namen hat + kompatible Datentypen in beiden Tabellen hat .. .. Sie können nur den Operator = verwenden

Bei einem Inner Join werden zwei Tabellen auf der Grundlage der in der ON-Klausel genannten gemeinsamen Spalten verbunden.

allgemeine Spalte: ist eine Spalte, die kompatible Datentypen in beiden Tabellen hat, aber nicht den gleichen Namen haben muss ..__ Sie können nur einen Vergleichsoperator wie =, <=, >=, <, >, <> verwenden.

1
Suchitra Phadke

Inner Join und Natural Join sind fast gleich, aber es gibt einen kleinen Unterschied zwischen ihnen. Der Unterschied besteht im natürlichen Join nicht in der Angabe der Bedingung, aber im inneren Join ist die Bedingung zwingend. Wenn wir die Bedingung in innerem Join angeben, ist die resultierende Tabelle wie ein kartesisches Produkt.

0
rashedcs