Verbund (Join)
Möglichkeiten von Aliasnamen und Join-Klausel
Durch den Prozess der Normalisierung werden sachlich zusammengehörige Informationen in verschiedene Tabellen zerlegt. Um diese verteilten Informationen wieder zu verbinden, ist eine Abfrage erforderlich, die gleichzeitig auf mehrere Tabellen zugreift. Ein Verbund (Join) bildet aus den Zeilen verschiedener Tabellen neue, zusammengehörige Zeilen, in denen die gewünschte Information wieder zusammengeführt bzw. verknüpft ist.
Es gibt hierfür zwei Möglichkeiten:
1. Tabellenalias
Bei einem Zugriff auf mehrere Tabellen können gleiche Spaltennamen in verschiedenen Tabellen auftreten. Zur eindeutigen Adressierung einer Spalte ist dann neben dem Spaltennamen ein Bezug auf die gewünschte Tabelle erforderlich. Hierfür kann in der FROM-Klausel ein Tabellen-Alias angegeben werden:
Beispiel
Die ISBN-Nummern, die reserviert wurden, werden mit Mitgliedsnummern und Mitgliedern, die reserviert haben, angezeigt.
SELECT Res.ISBN, Res.Mitglieds_Nr, Mit.Nachname FROM Reservierung AS Res, Mitglieder AS Mit WHERE Res.Mitglieds_Nr = Mit.Mitglieds_Nr
Wird kein Aliasname ausdrücklich für eine Tabelle vereinbart, ist der Tabellenname standardmäßig der Aliasname. Auf einen Aliasnamen kann nur dann verzichtet werden, wenn ein benutzter Spaltenname nur in einer der verwendeten Tabellen auftritt.
SELECT Mitglieder.Nachname, Reservierung.ISBN FROM Mitglieder, Reservierung ORDER BY Reservierung.ISBN
Aus Gründen der Übersichtlichkeit ist die Verwendung eines Aliasnamens auch in diesen Fällen empfehlenswert.
2. JOIN-Klausel
| SELECT | wähle |
| Feldliste | Feldnamen (durch Kommata getrennt) |
| FROM | der Tabelle |
| Tabelle | Tabellenname (mehrere durch Komma getrennt) |
| INNER | LEFT | RIGHT |
nur verknüpfte Datensätze - oder alle Datensätze der linken Tabelle - oder alle Datensätze der rechten Tabelle mit |
| JOIN | Verbindung zur |
| Tabelle | Tabellenname |
| ON | mit der Bedingung |
| Tabelle | Bedingung, die das Kriterium für die Verbindung der Tabellen enthält |
Beispiele
Alle Mitglieder und Mitgliedsnummern, die reserviert haben, werden mit entsprechender ISBN-Nummer angezeigt.
SELECT Mitglieder.Mitglieds_Nr, Nachname, ISBN FROM Mitglieder INNER JOIN Reservierung ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
Alle Mitglieder werden mit Mitgliedsnummern angezeigt, falls Reservierungen vorliegen, werden ISBN-Nummern angezeigt.
SELECT Mitglieder.Mitglieds_Nr, Nachname, ISBN FROM Mitglieder LEFT JOIN Reservierung ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
Innerer und äußerer Verbund
Cross Join (kartesisches Produkt)
Jede Zeile der einen Tabelle wird mit allen Zeilen der anderen Tabelle verbunden. Das folgende Beispiel zeigt das Prinzip, wenn es auch inhaltlich wenig sinnvoll ist:
Beispiel
Alle Mitgliedsnummern und Mitglieder, die reserviert haben, werden mit allen ISBN-Nummern angezeigt.
SELECT Mitglieder.Mitglieds_Nr, Mitglieder.Nachname, Exemplar.ISBN FROM Mitglieder, Exemplar
So lassen sich alle möglichen Kombinationen aus mehreren Tabellen abfragen:
SELECT MealName, DrinkName FROM Meals, Drinks

Veranschaulichung eines Cross Join (02.05.2024)
Condition Join
Bei diesem Verbund steuert ein Vergleich von Spalteninhalten der einen Tabelle mit Spalteninhalten der zweiten Tabelle die auszuwählenden Zeilen. Die zu vergleichenden Spalten und der verwendete Vergleichsoperator sind dabei beliebig (gleich, kleiner, größer, ungleich usw.). Oft wird auf Gleichheit von Spalteninhalten geprüft (Equi-Join).
Beispiele
Die ISBN-Nummern, die reserviert wurden, werden mit Mitgliedsnummern und Mitgliedern, die reserviert haben, angezeigt.
SELECT Res.ISBN, Res.Mitglieds_Nr, Mit.Nachname FROM Reservierung AS Res, Mitglieder AS Mit WHERE Res.Mitglieds_Nr = Mit.Mitglieds_Nr
SELECT ISBN, Reservierung.Mitglieds_Nr, Nachname FROM Reservierung INNER JOIN Mitglieder ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
zu SQL-Beispiel 1: Die Auswahl der Zeilen kann man sich so vorstellen: Zunächst wird das kartesische Produkt aus den Tabellen Reservierung und Mitglieder gebildet. Es enthält alle möglichen Zeilenkombinationen von Reservierung und Mitglieder. Aus diesem Zwischenergebnis werden nun die Zeilen ausgesucht, in denen Reservierung.Mitglieds_Nr und Mitglieder.Mitglieds_Nr identisch sind (Selektion). Von den verbleibenden Zeilen werden die Spalten Reservierung.ISBN, Reservierung.Mitglieds_Nr und Mitglieder.Nachname ausgewählt (Projektion) und angezeigt.
zu SQL-Beispiel 2: Der Vorteil ist, hier wird kein kartesisches Produkt gebildet. Die Bedingung wird bei der Verknüpfung schon beachtet. Daher ergibt sich ein großer Performance-Gewinn bei großen Tabellen.
Äußere Verbund (Outer Join)
Die Ergebnistabelle des Equi-Join oben zeigt: Zeilen in den Ausgangstabellen, die die Gleichheitsbedingung nicht erfüllen, werden ignoriert. Mitglieder die nicht reserviert haben erscheinen auch nicht in der Ergebnistabelle. Ein Outer Join übernimmt auch solche Zeilen mit in die Ergebnistabelle. Drei Varianten sind möglich:
Left Outer Join
Bei einem Left Outer Join werden alle Zeilen der ersten (linken) Tabelle mit in die Ergebnistabelle übernommen.
Beispiel
Alle Mitglieder werden mit Mitgliedsnummern angezeigt, falls Reservierungen vorliegen, werden ISBN-Nummern angezeigt.
SELECT Mitglieder.Mitglieds_Nr, Nachname, ISBN FROM Mitglieder LEFT JOIN Reservierung ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
Right Outer Join
Bei einem Right Outer Join werden alle Zeilen der zweiten (rechten) Tabelle mit in die Ergebnistabelle übernommen.
Beispiel
Alle Mitgliedsnummern und Nachnamen werden angezeigt, falls Reservierungen vorliegen, werden die ISBN-Nummern aufgeführt.
SELECT ISBN, Mitglieder.Mitglieds_Nr, Nachname FROM Reservierung RIGHT JOIN Mitglieder ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
Full Outer Join
Ein Full Outer Join übernimmt die Zeilen der linken und auch der rechten Tabelle ohne jeweilige Entsprechung mit in die Ergebnistabelle.
Beispiel
Alle Mitgliedsnummern, Nachnamen und ISBN-Nummern werden aufgeführt.
SELECT ISBN, Mitglieder.Mitglieds_Nr, Nachname FROM Reservierung FULL OUTER JOIN Mitglieder ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr
Mehr als zwei Basistabellen
Die Ausführungen zum Verbund können auf mehr als zwei Basistabellen übertragen werden.
Beispiel
Alle ISBN-Nummern nicht arabisch-sprachiger Bücher werden angezeigt, falls Reservierungen vorliegen, werden entsprechende Mitgliedsnummern, Mitglieder und Sprache angezeigt.
SELECT Reservierung.ISBN, Mitglieder.Mitglieds_Nr, Nachname, Sprache FROM Reservierung LEFT JOIN Mitglieder ON Reservierung.Mitglieds_Nr = Mitglieder.Mitglieds_Nr INNER JOIN Buch ON Sprache = "arabic"