Beitreten (SQL)
Das JOINist eine Klausel der SQL -Sprache , die verwendet wird, um die Tupel von zwei oder mehr Relationen einer Datenbank zu kombinieren . Der ANSI -Standard definiert einige Spezifikationen für die SQL-Sprache über die auszuführenden Typen JOIN:,, INNERund , FULLzu denen verschiedene DBMSs hinzufügen . In einigen Fällen ist es möglich, dass eine Tabelle mit sich selbst kombiniert werden kann, in diesem Fall sprechen wir von Selbstverknüpfung .
LEFTRIGHTCROSS
Beispieltabellen
Alle nachstehenden Beispiele verwenden die folgenden zwei Tabellen
| Nachname | Abteilungs-ID |
|---|---|
| Rossi | 31 |
| Weiße | 33 |
| Mancini | 33 |
| Santoro | 34 |
| Monti | 34 |
| Fett | Null
|
| Abteilungs-ID | Abteilungsname |
|---|---|
| 31 | Verkauf |
| 33 | Techniker |
| 34 | Humanressourcen |
| 35 | Förderung |
Dipartimenti.ID_dipartimentoist der Primärschlüssel, der eine 0: n-Kardinalität gegenüber dem Feld hatImpiegati.ID_dipartimento
Hinweis: Die Abteilung „Beförderung“ in der Tabelle „Abteilungen“ hat keine Entsprechung in der Tabelle „Mitarbeiter“. Während der Mitarbeiter „Grassi“ keiner Abteilung zugeordnet ist ( Null).
Inner Join
Ein Inner Join erstellt eine neue Tabelle, indem die Werte der beiden Ausgangstabellen (A und B) basierend auf einer bestimmten Vergleichsregel kombiniert werden. Die Abfrage vergleicht jede Zeile von Tabelle A mit jeder Zeile von Tabelle B und versucht, die definierte Sortierung zu erfüllen. Wenn die Join-Regel erfüllt ist, werden die Werte aller Spalten in den Tabellen A und B beim Aufbau der resultierenden Tabelle zu einer einzigen Zeile kombiniert. Innere Verknüpfung ist die am häufigsten verwendete Form der Verknüpfung in Anwendungen und der Standardmodus.
Die folgende Abfrage verbindet beispielsweise die beiden Tabellen „ Employees “ und „ Departments “ mit dem Primärschlüssel „ department_ID “ , der die Spalte in beiden Tabellen darstellt. Wenn die department_ID in beiden Tabellen übereinstimmt (d. h. die Regel erfüllt ist), kombiniert die Abfrage die Spalten Last Name , Department_ID und Department_Name in einer einzigen Zeile für die resultierende Tabelle.
Inner-Join-Beispiel in expliziter Form:
SELECT *
FROM Mitarbeiter
INNER JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
was äquivalent ist zu:
SELECT *
FROM Mitarbeiter , Abteilungen
WO Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
Ergebnis der Inner Join-Abfrage:
| Nachname der Mitarbeiter | Mitarbeiter.Abteilungs-ID | Abteilungen.Abteilungsname | Abteilungen.Abteilungs-ID |
|---|---|---|---|
| Santoro | 34 | Humanressourcen | 34 |
| Weiße | 33 | Techniker | 33 |
| Monti | 34 | Humanressourcen | 34 |
| Mancini | 33 | Techniker | 33 |
| Rossi | 31 | Verkauf | 31 |
Beachten Sie , dass der "Grassi"-Mitarbeiter und die Abteilung "Werbung" nicht anwesend sind, da der Grassi-Mitarbeiter eine NullWeile lang keine Beförderung in einem Mitarbeiter hat. Manchmal möchten Sie als Endergebnis auch Datensätze haben, die nicht übereinstimmen: In diesem Fall können Sie die Abfrage vom Typ Outer Join verwenden.
Equi-join
Equi - Join , auch bekannt als Equijoin , hat einen bestimmten Komparatortyp namens Theta Join , der nur mathematische Gleichheit als Vergleichsregel als Überprüfungsmethode verwendet. Die Verwendung anderer Vergleichsoperatoren (z. B. <) disqualifiziert den Join als Equi-Join. Die folgende Abfrage verwendet einen Equi-Join:
SELECT *
FROM Mitarbeiter
INNER JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
SQL bietet eine Abkürzung zum Definieren von Equi-Joins über das SchlüsselwortUSING
SELECT *
FROM Mitarbeiter
INNER JOIN Abteilungen
USING ( Department_ID )
Das Schlüsselwort USINGwird von Microsoft SQL Server Management Studio, MySQL, Oracle, PostgreSQL, SQLite und DB2/400 unterstützt.
Natürlicher Join
Ein natürlicher Join bietet zusätzliche Equi-Join-Spezialisierungen. Normalerweise vergleicht der Join Spalten aus verschiedenen Tabellen, die denselben Namen haben. Natural Join macht genau das.
Das folgende Beispiel zeigt die natürliche Join-Notation, die dem ersten definierten Inner-Join entspricht:
SELECT *
FROM Mitarbeiter NATURAL JOIN Abteilungen
| Abteilungs-ID | Nachname der Mitarbeiter | Abteilungen.Abteilungsname |
|---|---|---|
| 34 | Monti | Humanressourcen |
| 33 | Weiße | Techniker |
| 34 | Santoro | Humanressourcen |
| 33 | Mancini | Techniker |
| 31 | Rossi | Verkauf |
Kreuzverknüpfung
Ein Cross Join , ein kartesischer Join oder ein Produkt stellt die Grundlage (die IT-Infrastruktur) bereit, durch die alle Arten von Inner Joins funktionieren. Das Ergebnis eines Cross Joins ist das kartesische Produkt aller Zeilen der Tabellen, die zur Join-Abfrage beitragen. Es ist, als würde man sagen, dass wir eine innere Verknüpfung durchführen, ohne die Kollatierung festzulegen, oder dass die Kollatierung immer wahr zurückgibt.
Angesichts der beiden Starttabellen A und B wird der Cross Join A × B geschrieben.
Beispiel für einen expliziten Cross Join:
SELECT *
FROM Mitarbeiter CROSS JOIN Abteilungen
Ein weiteres implizites Beispiel für einen Cross Join:
SELECT *
FROM Mitarbeiter , Abteilungen ;
| Nachname der Mitarbeiter | Mitarbeiter.Abteilungs-ID | Abteilungen.Abteilungsname | Abteilungen.Abteilungs-ID |
|---|---|---|---|
| Rossi | 31 | Verkauf | 31 |
| Weiße | 33 | Verkauf | 31 |
| Mancini | 33 | Verkauf | 31 |
| Monti | 34 | Verkauf | 31 |
| Santoro | 34 | Verkauf | 31 |
| Fett | Null |
Verkauf | 31 |
| Rossi | 31 | Techniker | 33 |
| Weiße | 33 | Techniker | 33 |
| Mancini | 33 | Techniker | 33 |
| Monti | 34 | Techniker | 33 |
| Santoro | 34 | Techniker | 33 |
| Fett | Null |
Techniker | 33 |
| Rossi | 31 | Humanressourcen | 34 |
| Weiße | 33 | Humanressourcen | 34 |
| Mancini | 33 | Humanressourcen | 34 |
| Monti | 34 | Humanressourcen | 34 |
| Santoro | 34 | Humanressourcen | 34 |
| Fett | Null |
Humanressourcen | 34 |
| Rossi | 31 | Förderung | 35 |
| Weiße | 33 | Förderung | 35 |
| Mancini | 33 | Förderung | 35 |
| Monti | 34 | Förderung | 35 |
| Santoro | 34 | Förderung | 35 |
| Fett | Null |
Förderung | 35 |
Äußerer Join
Ein Outer Join erfordert keine exakte Übereinstimmung zwischen den Zeilen zweier Tabellen. Die aus einem Outer Join resultierende Tabelle enthält alle Datensätze, die keine Entsprechung zwischen den Tabellen haben. Outer Joins werden in Left Outer Joins , Right Outer Joins und Full Outer Joins unterteilt , je nachdem, für welche Tabelle wir Werte für den Fall einer Sortierungsabweichung von (links, rechts oder beides) speichern möchten.
( Links (links) und rechts (rechts) beziehen sich in diesem Fall auf die beiden Seiten des Schlüsselworts JOIN.)
HINWEIS zu WHERE- und ON-Klauseln:
Es wird betont, dass es eine Ausführungsreihenfolge zwischen den im WHERE angegebenen Bedingungen und denen im ON gibt.
Insbesondere werden die Klauseln in ON vor der Ausführung der Verknüpfung ausgewertet, während die Klauseln in where nach der Ausführung der Verknüpfung ausgewertet werden.
Left Outer Join
Das Ergebnis einer Left-Outer-Join -Abfrage (oder einfach Left-Join -Abfrage) für die Tabellen A und B enthält immer alle Datensätze der linken Tabelle ("links") A, während sie aus der Tabelle rechts ("rechts") extrahiert werden. B nur die Zeilen, die in der Sortierung des Joins übereinstimmen. Das bedeutet, wenn die Klausel ON0 (Null) Zeilen in B findet, zeigt der Join eine resultierende Zeile mit NULL-Wert in allen Spalten, die mit dem Ergebnis für die Spalten von B übereinstimmen.
Beispiel für einen Left Outer Join:
SELECT *
FROM Mitarbeiter LEFT OUTER JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
| Nachname der Mitarbeiter | Mitarbeiter.Abteilungs-ID | Abteilungen.Abteilungsname | Abteilungen.Abteilungs-ID |
|---|---|---|---|
| Weiße | 33 | Techniker | 33 |
| Rossi | 31 | Verkauf | 31 |
| Santoro | 34 | Humanressourcen | 34 |
| Monti | 34 | Humanressourcen | 34 |
| Fett | Null |
Null |
Null
|
| Mancini | 33 | Techniker | 33 |
Right Outer Join
Ein rechter äußerer Join (oder rechter Join ) folgt einfach der Operation des linken äußeren Joins, kehrt jedoch die Reihenfolge der betroffenen Tabellen um.
Das Ergebnis einer Right-Outer-Join - Abfrage für die Tabellen A und B enthält immer alle Datensätze der rechten Tabelle („rechts“) B, während aus der linken Tabelle („links“) A nur die Zeilen extrahiert werden, die in der Tabelle übereinstimmen - Sortierung des Joins. Das bedeutet, wenn die Klausel ON0 (Null) Zeilen in A findet, zeigt der Join eine resultierende Zeile mit NULL-Wert in allen Spalten, die mit dem Ergebnis für die Spalten von A übereinstimmen.
Beispiel für einen Right Outer Join:
SELECT *
FROM Mitarbeiter RIGHT OUTER JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
| Nachname der Mitarbeiter | Mitarbeiter.Abteilungs-ID | Abteilungen.Abteilungsname | Abteilungen.Abteilungs-ID |
|---|---|---|---|
| Monti | 34 | Humanressourcen | 34 |
| Weiße | 33 | Techniker | 33 |
| Santoro | 34 | Humanressourcen | 34 |
| Mancini | 33 | Techniker | 33 |
| Rossi | 31 | Verkauf | 31 |
Null |
Null |
Förderung | 35 |
In der Praxis werden Left-Outer-Join-Abfragen häufiger verwendet als Right-Outer-Join-Abfragen, aber es kann seltene Fälle geben, in denen sehr komplexe Abfragen gleichzeitig die Left-Outer-Join- und Right-Outer-Join-Kriterien verwenden müssen.
Das gleiche Ergebnis des vorherigen Right Outer Joins kann mit dem Left Outer Join-Typ wiederholt werden:
SELECT *
FROM Abteilungen LEFT OUTER JOIN Mitarbeiter
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
Vollständiger äußerer Join
Ein Full Outer Join kombiniert die Ergebnisse der beiden Tabellen A und B unter Berücksichtigung aller Zeilen der Tabellen, auch derer, die einander nicht entsprechen.
Das Ergebnis einer vollständigen Outer-Join - Abfrage für die Tabellen A und B enthält immer alle Datensätze der linken Tabelle ("links") A, wobei aus der rechten Tabelle ("rechts") B nur die Zeilen extrahiert werden, die der Join-Vergleichsregel entsprechen ; Außerdem werden alle Datensätze der linken Tabelle ("links") A, die in der rechten Tabelle ("rechts") B nicht übereinstimmen, extrahiert, indem die Werte aller Spalten der Tabelle B und auf NULL gesetzt werden alle Datensätze der rechten Tabelle ("rechts") B, die in der linken Tabelle ("links") A nicht übereinstimmen, indem die Werte aller Spalten der Tabelle A auf NULL gesetzt werden.
Beispiel für einen Full Outer Join:
SELECT *
FROM Mitarbeiter
FULL OUTER JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Abteilungs-ID
| Nachname der Mitarbeiter | Mitarbeiter.Abteilungs-ID | Abteilungen.Abteilungsname | Abteilungen.Abteilungs-ID |
|---|---|---|---|
| Monti | 34 | Humanressourcen | 34 |
| Weiße | 33 | Techniker | 33 |
| Santoro | 34 | Humanressourcen | 34 |
| Fett | Null |
Null |
Null
|
| Mancini | 33 | Techniker | 33 |
| Rossi | 31 | Verkauf | 31 |
Null |
Null |
Förderung | 35 |
Einige Datenbanken (z. B. MySQL) unterstützen diese Funktionalität nicht direkt, aber sie kann durch die Kombination von linken und rechten äußeren Verknüpfungen mithilfe des Schlüsselworts union emuliert werden .
Das Erstellen einer vollständigen Outer-Join-Abfrage erfolgt wie folgt:
SELECT *
FROM Mitarbeiter
LEFT JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Department_ID
UNION
SELECT *
FROM Mitarbeiter
RIGHT JOIN Departments
ON Mitarbeiter . Department_ID = Abteilungen . Department_ID
WO Mitarbeiter . Department_ID IST NULL
Ebenso ohne die rechte Outer-Join-Abfrage zu verwenden:
AUSWAHL Mitarbeiter . * , Abteilungen . *
FROM Mitarbeiter
LEFT JOIN Abteilungen
ON Mitarbeiter . Department_ID = Abteilungen . Department_ID
UNION
SELECT Mitarbeiter . * , Abteilungen . *
AUS Abteilungen
LEFT JOIN Mitarbeiter
ON Mitarbeiter . Department_ID = Abteilungen . Department_ID
WO Mitarbeiter . Department_ID IST NULL
Selbst beitreten
Self-Join wird verwendet, um eine Tabelle mit sich selbst zu verbinden.
Verwandte Artikel
Externe Links
- Einführung in JOINs in der AskMonty-Wissensdatenbank