Was ist der Unterschied zwischen einer natürlichen und einer inneren Verbindung?
sql
join
natural-join
Schmied
quelle
quelle
Antworten:
Ein wesentlicher Unterschied zwischen INNER JOIN und NATURAL JOIN ist die Anzahl der zurückgegebenen Spalten.
Erwägen:
Die
INNER JOIN
von Tabelle A und Tabelle B in Spalte 1 werden zurückgegebenDie
NATURAL JOIN
von Tabelle A und Tabelle B in Spalte 1 geben Folgendes zurück: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.
undb.
Teile , die nicht in den Spaltennamen sein würde, würden Sie gerade habencolumn1
,column2
,column1
,column3
wie die Überschriften. )quelle
NATURAL JOIN
ruinieren wird, warum es unerwartet ist und in welcher Welt du bist?Customers
undEmployees
, Beitritt aufEmployeeID
.Employees
hat auch einManagerID
Feld. Alles ist gut. Dann, eines Tages, fügt jemandManagerID
derCustomers
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 , daSELECT * FROM TableA INNER JOIN TableB USING (Column1)
undSELECT * FROM TableA NATURAL JOIN TableB
gleich sind, sie geben beide 3 Spalten.natural left
oder habennatural 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:
NichtStandard-SQL [SQL 92] unddaher nichtportabel, nicht besonders lesbar (von den meisten SQL-Codierern) und möglicherweise nicht von verschiedenen Tools / Bibliotheken unterstütztquelle
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 sindtablename_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.
Ist das gleiche wie...
Was Sie mit dem Verknüpfungsformat jedoch nicht tun können, sind komplexere Verknüpfungen ...
quelle
NATURAL JOIN ... USING ()
? Der Standard ist entwedera NATURAL JOIN b
odera JOIN b USING (c)
room_number
, während Ihre inneren Verknüpfungen zwei Spalten mit dem Namen habenroom_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 derNATURAL JOIN
beiden Tabellen enthält Spalten, die nach Namen de-dupliziert wurden, daher keine anonymen Spalten. In ähnlicher WeiseUNION CORRESPONDING
undEXCEPT CORRESPONDING
sind an Adresse SQL Abhängigkeit von Spaltenordnung in dem Legacy vorgesehenUNION
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ördernVIEW
s :)Beachten Sie, dass SQL
NATURAL JOIN
ein Equi-Join ** ist. Dies ist jedoch kein Hindernis für die Nützlichkeit. Bedenken Sie, dassNATURAL 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
mitINNER JOIN
und projection (SELECT
) geschrieben werden kann , ist es auch wahr, dass jederINNER JOIN
mit product (CROSS JOIN
) und einschränkung (WHERE
) geschrieben werden kann; Beachten Sie außerdem, dass eineNATURAL JOIN
Zwischen-Tabelle ohne gemeinsame Spaltennamen das gleiche Ergebnis liefert wieCROSS JOIN
. Wenn Sie also nur an Ergebnissen interessiert sind, die Beziehungen sind (und warum nicht?!), Ist diesNATURAL JOIN
der einzige Join-Typ, den Sie benötigen. Sicher, es ist wahr, dass aus Sicht des Sprachdesigns Abkürzungen wieINNER JOIN
undCROSS 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:
** Relational Natural Join ist kein Äquijoin, sondern eine Projektion von einem. - philipxy
quelle
Ein
NATURAL
Join ist nur eine kurze Syntax für einen bestimmtenINNER
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 vonOUTER
(LEFT
/RIGHT
) oderCROSS
Joins.Siehe den Equi-Join- Abschnitt auf Wikipedia:
Das heißt, alle
NATURAL
Verknüpfungen können alsINNER
Verknüpfungen geschrieben werden (aber das Gegenteil ist nicht der Fall). Erstellen Sie dazu einfach das Prädikat explizit - z. B.USING
oderON
- 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 aufLEFT
undRIGHT
Joins angewendet werden , und das Gleiche gilt. EinNATURAL LEFT/RIGHT
Join ist nur eine kurze Syntax für einen bestimmtenLEFT/RIGHT
Join.)quelle
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
quelle
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
=
,<=
,>=
,<
,>
,<>
quelle
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.
quelle
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.
quelle
INNER JOIN:
quelle
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.
quelle
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 FelderINNER JOIN
müssen nicht denselben Namen haben.