Join (SQL) (Deutsch)

Ein innerer Join erfordert, dass jede Zeile in den beiden verbundenen Tabellen übereinstimmende Spaltenwerte aufweist. Dies ist eine häufig verwendete Join-Operation in Anwendungen, sollte jedoch nicht als die beste Wahl angesehen werden in allen Situationen. Inner Join erstellt eine neue Ergebnistabelle, indem Spaltenwerte von zwei Tabellen (A und B) basierend auf dem Join-Prädikat kombiniert werden. Die Abfrage vergleicht jede Zeile von A mit jeder Zeile von B, um alle Zeilenpaare zu finden, die das Join-Prädikat erfüllen. Wenn das Join-Prädikat durch Abgleichen von Nicht-NULL-Werten erfüllt ist, werden Spaltenwerte für jedes übereinstimmende Zeilenpaar von A und B zu einer Ergebniszeile kombiniert.

Das Ergebnis des Joins kann als definiert werden Ergebnis der ersten Verwendung des kartesischen Produkts (oder Cross-Joins) aller Zeilen in den Tabellen (Kombination jeder Zeile in Tabelle A mit jeder Zeile in Tabelle B) und anschließender Rückgabe aller Zeilen, die das Join-Prädikat erfüllen. Tatsächliche SQL-Implementierungen verwenden normalerweise andere Ansätze, wie z. B. Hash-Joins oder Sort-Merge-Joins, da die Berechnung des kartesischen Produkts langsamer ist und häufig eine unerschwinglich große Speichermenge zum Speichern erfordert.

SQL gibt zwei verschiedene syntaktische Methoden an Möglichkeiten, Joins auszudrücken: die „explizite Join-Notation“ und die „implizite Join-Notation“. Die „implizite Join-Notation“ wird nicht mehr als bewährte Methode angesehen, obwohl Datenbanksysteme sie weiterhin unterstützen.

Die „explizite Join-Notation“ verwendet das Schlüsselwort JOIN. Optional wird das Schlüsselwort INNER vorangestellt, um die zu verbindende Tabelle anzugeben, und das Schlüsselwort ON, um die Prädikate für den Join anzugeben, wie in das folgende Beispiel:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;

Employee.LastName Employee.DepartmentID Department.DepartmentName
Robinson 34 Büroangestellter
Jones 33 Engineering
Smith 34 Büroangestellter
Heisenberg 33 Engineering
Rafferty 31 Vertrieb

Die „implizite Join-Notation“ listet einfach t auf Die Tabellen zum Verbinden werden in der FROM -Klausel der SELECT -Anweisung durch Kommas getrennt. Daher wird eine Kreuzverknüpfung angegeben, und die WHERE -Klausel kann zusätzliche Filterprädikate anwenden (die vergleichbar mit den Verknüpfungsprädikaten in der expliziten Notation funktionieren).

Das folgende Beispiel entspricht dem vorherigen, diesmal jedoch mit impliziter Join-Notation:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Die in den Beispielen angegebenen Abfragen Oben werden die Mitarbeiter- und Abteilungstabellen mithilfe der Spalte DepartmentID beider Tabellen verknüpft. Wenn die DepartmentID dieser Tabellen übereinstimmt (d. H. Das Join-Prädikat ist erfüllt), kombiniert die Abfrage die Spalten LastName, DepartmentID und DepartmentName aus den beiden Tabellen zu einer Ergebniszeile. Wenn die DepartmentID nicht übereinstimmt, wird keine Ergebniszeile generiert.

Das Ergebnis der Ausführung der obigen Abfrage lautet also:

Employee.LastName Employee.DepartmentID Department.DepartmentName
Robinson 34 Büroangestellter
Jones 33 Ingenieurwesen
Smith 34 Büro
Heisenberg 33 Engineering
Rafferty 31 Vertrieb

Der Mitarbeiter „Williams“ und die Abteilung „Marketing“ werden in den Ergebnissen der Abfrageausführung nicht angezeigt. Keine dieser Zeilen enthält übereinstimmende Zeilen in der jeweiligen Tabelle: „Williams“ hat keine zugeordnete Abteilung, und kein Mitarbeiter hat die Abteilungs-ID 35 („Marketing“). Abhängig von den gewünschten Ergebnissen kann dieses Verhalten ein subtiler Fehler sein, der vermieden werden kann, indem der innere Join durch einen äußeren Join ersetzt wird.

Innerer Join und NULL-WerteEdit

Programmierer sollten dies tun Besondere Vorsicht beim Verknüpfen von Tabellen in Spalten, die NULL-Werte enthalten können, da NULL niemals mit einem anderen Wert übereinstimmt (nicht einmal mit NULL selbst), es sei denn, die Verknüpfungsbedingung verwendet explizit ein Kombinationsprädikat, das zuerst überprüft, ob die Verknüpfungsspalten , bevor die verbleibenden Prädikatbedingungen angewendet werden. Der innere Join kann nur sicher in einer Datenbank verwendet werden, die die referenzielle Integrität erzwingt oder in der die Join-Spalten garantiert nicht NULL sind. Viele relationale Datenbanken für die Transaktionsverarbeitung basieren auf ACID-Standards (Atomicity, Consistency, Isolation, Durability), um die Datenintegrität sicherzustellen und innere Verknüpfungen zu einer geeigneten Wahl zu machen. Transaktionsdatenbanken haben jedoch normalerweise auch wünschenswerte Verknüpfungsspalten, die NULL sein dürfen.Viele relationale Datenbank- und Data Warehouses für die Berichterstellung verwenden ETL-Stapelaktualisierungen (Extract, Transform, Load) mit hohem Volumen, die die Durchsetzung der referenziellen Integrität erschweren oder unmöglich machen. Dies führt zu potenziell NULL-Join-Spalten, die ein SQL-Abfrageautor nicht ändern kann und die dazu führen, dass innere Joins weggelassen werden Daten ohne Hinweis auf einen Fehler. Die Wahl eines inneren Joins hängt vom Datenbankdesign und den Dateneigenschaften ab. Ein linker äußerer Join kann normalerweise einen inneren Join ersetzen, wenn die Join-Spalten in einer Tabelle NULL-Werte enthalten können.

Eine Datenspalte, die NULL (leer) sein kann, sollte niemals als Link in einem verwendet werden innerer Join, es sei denn, das beabsichtigte Ergebnis besteht darin, die Zeilen mit dem NULL-Wert zu entfernen. Wenn NULL-Join-Spalten absichtlich aus der Ergebnismenge entfernt werden sollen, kann ein innerer Join schneller sein als ein äußerer Join, da der Tabellen-Join und die Filterung in einem einzigen Schritt erfolgen. Umgekehrt kann ein innerer Join zu einer katastrophal langsamen Leistung oder sogar zu einem Serverabsturz führen, wenn er in einer Abfrage mit großem Volumen in Kombination mit Datenbankfunktionen in einer SQL Where-Klausel verwendet wird. Eine Funktion in einer SQL Where-Klausel kann dazu führen, dass die Datenbank relativ kompakte Tabellenindizes ignoriert. Die Datenbank kann die ausgewählten Spalten aus beiden Tabellen lesen und innerlich verknüpfen, bevor die Anzahl der Zeilen mithilfe des Filters verringert wird, der von einem berechneten Wert abhängt, was zu einer relativ enormen Menge ineffizienter Verarbeitung führt.

Wenn eine Ergebnismenge wird durch Zusammenfügen mehrerer Tabellen erzeugt, einschließlich Mastertabellen, die zum Nachschlagen von Volltextbeschreibungen numerischer Bezeichnercodes (eine Nachschlagetabelle) verwendet werden. Ein NULL-Wert in einem der Fremdschlüssel kann dazu führen, dass die gesamte Zeile aus der Ergebnismenge entfernt wird. ohne Fehleranzeige. Eine komplexe SQL-Abfrage, die eine oder mehrere innere Verknüpfungen und mehrere äußere Verknüpfungen enthält, birgt das gleiche Risiko für NULL-Werte in den inneren Verknüpfungsverbindungsspalten.

Bei einer Zusage für SQL-Code, der innere Verknüpfungen enthält, wird davon ausgegangen, dass NULL-Verknüpfungsspalten dies nicht tun durch zukünftige Änderungen eingeführt werden, einschließlich Herstelleraktualisierungen, Designänderungen und Massenverarbeitung außerhalb der Datenvalidierungsregeln der Anwendung wie Datenkonvertierungen, Migrationen, Massenimporte und -zusammenführungen.

Man kann innere Verknüpfungen weiter klassifizieren als Equi-Joins, als natürliche Joins oder als Cross-Joins.

Equi-joinEdit

Ein Equi-Join ist ein bestimmter Typ eines komparatorbasierten Joins, der nur Gleichheitsvergleiche verwendet Wenn Sie andere Vergleichsoperatoren verwenden (z. B. <), wird ein Join als Equi-Join disqualifiziert. Die oben gezeigte Abfrage enthält bereits ein Beispiel für einen Equi-Join:

SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;

Wir können Equi-Join wie folgt schreiben:

SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Wenn co Spalten in einem Equi-Join haben denselben Namen. SQL-92 bietet eine optionale Kurzschreibweise zum Ausdrücken von Equi-Joins über das Konstrukt USING:

SELECT *FROM employee INNER JOIN department USING (DepartmentID);

Das Konstrukt USING ist jedoch mehr als nur syntaktischer Zucker, da die Ergebnismenge vom Ergebnis abweicht Satz der Version mit dem expliziten Prädikat. Insbesondere werden alle in der Liste USING genannten Spalten nur einmal mit einem nicht qualifizierten Namen und nicht einmal für jede Tabelle im Join angezeigt. Im obigen Fall gibt es eine einzelne DepartmentID -Spalte und keine employee.DepartmentID oder department.DepartmentID

Die USING -Klausel wird von MS SQL Server und Sybase nicht unterstützt.

Natural joinEdit

Die natürliche join ist ein Sonderfall von equi-join. Natural Join (⋈) ist ein binärer Operator, der als (R ⋈ S) geschrieben wird, wobei R und S Beziehungen sind. Das Ergebnis der natürlichen Verknüpfung ist die Menge aller Kombinationen von Tupeln in R und S, die in ihren gemeinsamen Attributnamen gleich sind.Betrachten Sie als Beispiel die Tabellen Employee und Dept und ihre natürliche Verknüpfung:

Mitarbeiter
Name EmpId DeptName
Harry 3415 Finanzen
Sally 2241 Vertrieb
George 3401 Finanzen
Harriet 2202 Verkäufe
Abteilung
DeptName Manager
Finanzen George
Vertrieb Harriet
Produktion Charles
Mitarbeiter ⋈ {\ displaystyle \ bowtie} Abteilung
Name EmpId DeptName Manager
Harry 3415 Finanzen George
Sally 2241 Vertrieb Harriet
George 3401 Finanzen George
Harriet 2202 Verkäufe Harriet

Dies kann auch zum Definieren der Zusammensetzung von Beziehungen verwendet werden. Die Zusammensetzung von Mitarbeiter und Abteilung ist beispielsweise die oben gezeigte Verknüpfung, die auf alle außer dem gemeinsamen Attribut DeptName projiziert wird. In der Kategorietheorie ist die Verknüpfung genau das Faserprodukt.

Die natürliche Verknüpfung ist wohl einer der wichtigsten Operatoren, da sie das relationale Gegenstück zum logischen UND ist. Beachten Sie, dass, wenn dieselbe Variable in jedem von zwei Prädikaten erscheint, die durch UND verbunden sind, diese Variable für dasselbe steht und beide Erscheinungen immer durch denselben Wert ersetzt werden müssen. Insbesondere ermöglicht die natürliche Verknüpfung die Kombination von Beziehungen, die einem Fremdschlüssel zugeordnet sind. Im obigen Beispiel enthält beispielsweise wahrscheinlich ein Fremdschlüssel von Employee.DeptName zu Dept.DeptName, und dann kombiniert die natürliche Verknüpfung von Employee and Dept alle Mitarbeiter mit ihren Abteilungen. Dies funktioniert, weil der Fremdschlüssel zwischen Attributen mit demselben Namen gilt. Wenn dies nicht der Fall ist, wie im Fremdschlüssel von Dept.manager zu Employee.Name, müssen diese Spalten umbenannt werden, bevor der natürliche Join ausgeführt wird. Ein solcher Join wird manchmal auch als Equi-Join bezeichnet.

Formal wird die Semantik des natürlichen Joins wie folgt definiert:

R ⋈ S = {t ∪ s ∣ t ∈ R. ∧ s ∈ S ∧ F un (t ∪ s)} {\ displaystyle R \ bowtie S = \ left \ {t \ cup s \ mid t \ in R \ \ land \ s \ in S \ \ land \ {\ mathit {Fun}} (t \ cup s) \ right \}},

wobei Fun ein Prädikat ist, das genau dann für eine Beziehung r gilt, wenn r eine Funktion ist. Normalerweise müssen R und S mindestens ein gemeinsames Attribut haben. Wenn diese Einschränkung jedoch weggelassen wird und R und S keine gemeinsamen Attribute haben, wird die natürliche Verknüpfung genau zum kartesischen Produkt.

Die Die natürliche Verknüpfung kann mit den Grundelementen von Codd wie folgt simuliert werden. Sei c1,…, cm die für R und S gemeinsamen Attributnamen, r1,…, rn die für R eindeutigen Attributnamen und sei s1,…, sk die Für S eindeutige Attribute Nehmen wir außerdem an, dass die Attributnamen x1,…, xm weder in R noch in S sind. In einem ersten Schritt können die allgemeinen Attributnamen in S jetzt umbenannt werden:

T = ρ x 1 / c 1,…, xm / cm (S) = ρ x 1 / c 1 (ρ x 2 / c 2 (… ρ xm / cm (S)…)) {\ displaystyle T = \ rho _ {x_ {1} / c_ {1}, \ ldots, x_ {m} / c_ {m}} (S) = \ rho _ {x_ {1} / c_ {1}} (\ rho _ {x_ {2} / c_ {2 }} (\ ldots \ rho _ {x_ {m} / c_ {m}} (S) \ ldots))}

Dann nehmen wir das kartesische Produkt und wählen die Tupel aus, die verbunden werden sollen:

U = π r 1,…, rn, c 1,…, cm, s 1,…, sk (P) {\ Anzeigestil U = \ pi _ {r_ {1}, \ ldots, r_ {n}, c_ {1}, \ ldots, c_ {m}, s_ {1}, \ ldots, s_ {k}} (P)}

Ein natürlicher Join ist eine Art von Equi- Join, bei dem das Join-Prädikat implizit entsteht, indem alle Spalten in beiden Tabellen verglichen werden, 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. Falls keine Spalten mit demselben Namen gefunden werden, ist das Ergebnis eine Kreuzverknüpfung.

Die meisten Experten sind sich einig, dass NATURAL JOINs gefährlich sind und daher von ihrer Verwendung dringend abraten. Die Gefahr besteht darin, dass versehentlich eine neue Spalte hinzugefügt wird, die den gleichen Namen wie eine andere Spalte in der anderen Tabelle hat. Ein vorhandener natürlicher Join kann dann „natürlich“ die neue Spalte für Vergleiche verwenden und Vergleiche / Übereinstimmungen anhand anderer Kriterien (aus verschiedenen Spalten) als zuvor durchführen. Somit kann eine vorhandene Abfrage zu unterschiedlichen Ergebnissen führen, obwohl die Daten in den Tabellen nicht geändert, sondern nur erweitert wurden.Die Verwendung von Spaltennamen zur automatischen Ermittlung von Tabellenverknüpfungen ist in großen Datenbanken mit Hunderten oder Tausenden von Tabellen keine Option, bei denen die Namenskonventionen unrealistisch eingeschränkt würden. Reale Datenbanken werden üblicherweise mit Fremdschlüsseldaten entworfen, die aufgrund von Geschäftsregeln und Kontext nicht konsistent ausgefüllt sind (NULL-Werte sind zulässig). Es ist üblich, Spaltennamen ähnlicher Daten in verschiedenen Tabellen zu ändern, und dieser Mangel an starrer Konsistenz führt dazu, dass natürliche Verknüpfungen zu einem theoretischen Diskussionskonzept werden.

Die obige Beispielabfrage für innere Verknüpfungen kann als natürliche ausgedrückt werden Verbinden Sie sich wie folgt:

SELECT *FROM employee NATURAL JOIN department;

Wie bei der expliziten USING -Klausel, In der verknüpften Tabelle kommt nur eine DepartmentID-Spalte ohne Qualifizierer vor:

DepartmentID Employee.LastName Department.DepartmentName
34 Smith Clerical
33 Jones Engineering
34 Robinson Büroangestellter
33 Heisenberg Ingenieurwesen
31 Rafferty Verkäufe

PostgreSQL, MySQL und Oracle su pport natural verbindet sich; Microsoft T-SQL und IBM DB2 nicht. Die im Join verwendeten Spalten sind implizit, sodass der Join-Code nicht anzeigt, welche Spalten erwartet werden, und eine Änderung der Spaltennamen kann die Ergebnisse ändern. Im SQL: 2011-Standard sind natürliche Verknüpfungen Teil des optionalen Pakets F401 „Extended Joined Table“.

In vielen Datenbankumgebungen werden die Spaltennamen von einem externen Anbieter und nicht vom Abfrageentwickler gesteuert. Ein natürlicher Join setzt Stabilität und Konsistenz in Spaltennamen voraus, die sich während vom Hersteller vorgeschriebener Versionsaktualisierungen ändern können.

Write a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.