Im vorherigen Abschnitt haben wir die einfachsten Möglichkeiten zum Kombinieren von Tabellen betrachtet – mithilfe der Sätze WHERE und INNER JOIN. Diese Kombinationen werden interne Kombinationen oder Äquivalenzkombinationen genannt. Allerdings bietet SQL noch viel mehr Möglichkeiten zum Verknüpfen von Tabellen, nämlich auch andere Arten von Joins: Outer-Joins, Natural-Joins und Self-Joins. Aber überlegen wir uns zunächst, wie wir Tabellen Aliase zuweisen können, da wir später gezwungen sein werden, vollständige Feldnamen (Table.Field) zu verwenden, die ohne Abkürzungen aufgrund ihrer großen Länge nur sehr schwer zu bedienen sein werden.
Im vorherigen Abschnitt haben wir gelernt, wie Aliase verwendet werden können, um auf bestimmte Tabellenfelder oder berechnete Felder zu verweisen. SQL ermöglicht uns auch die Verwendung von Aliasnamen anstelle von Tabellennamen. Dies verschafft uns Vorteile wie eine kürzere SQL-Syntax und ermöglicht es uns, dieselbe Tabelle mehrmals in der SELECT-Anweisung zu verwenden.
Run SQLSELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name
Für jeden Verkäufer haben wir die Gesamtmenge der verkauften Waren angezeigt. In unserer SQL-Abfrage haben wir folgende Aliase verwendet: für das berechnete Feld SUM(Amount) den Alias Sum1, für die Tabelle Sellers den Alias S und für Sumproduct den Alias SP. Beachten Sie, dass Tabellenaliase auch in anderen Sätzen verwendet werden können, z. B. ORDER BY, GROUP BY und anderen.
Betrachten wir ein Beispiel. Nehmen wir an, wir müssen die Adressen von Verkäufern kennen, die im selben Land wie John Smith handeln. Dazu erstellen wir folgende Anfrage:
Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country
FROM Sellers
WHERE Seller_name = 'John Smith')
Wir können dieses Problem auch durch Selbstverbindung lösen, indem wir den folgenden Code schreiben:
Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'
Zur Lösung dieses Problems wurden Pseudonyme verwendet. Beim ersten Mal wurde der Tabelle Sellers der Alias S1 zugewiesen, beim zweiten Mal der Alias S2. Diese Aliase können dann als Tabellennamen verwendet werden. Im Operator WHERE fügen wir dem Namen jedes Felds das Präfix S1 hinzu, damit das DBMS versteht, welche Felder welche Tabelle ausgegeben werden soll (da wir aus einer Tabelle zwei virtuelle Tabellen erstellt haben). Die WHERE-Klausel verknüpft zunächst die Tabellen und filtert dann die Daten der zweiten Tabelle nach dem Feld Seller_name, um nur die erforderlichen Werte zurückzugeben.
Selbstverknüpfungen werden häufig verwendet, um Unterabfragen zu ersetzen, die Daten aus derselben Tabelle wie der äußere Operator SELECT auswählen. Obwohl das Endergebnis dasselbe ist, verarbeiten viele DBMS Verknüpfungen viel schneller als Unterabfragen. Es lohnt sich zu experimentieren, um herauszufinden, welche Abfrage schneller funktioniert.
Ein natürlicher Join ist ein Join, bei dem Sie nur die Spalten auswählen, die sich nicht wiederholen. Dies geschieht normalerweise, indem man (SELECT *) für eine Tabelle schreibt und eine Liste von Feldern für die restlichen Tabellen angibt. Beispiel:
Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City
In diesem Beispiel wird der Platzhalter (*) nur für die erste Tabelle verwendet. Alle anderen Spalten werden explizit angegeben, sodass doppelte Spalten nicht ausgewählt werden.
Normalerweise werden beim Zusammenführen die Zeilen einer Tabelle mit den entsprechenden Zeilen einer anderen Tabelle verbunden. In einigen Fällen kann es jedoch erforderlich sein, Zeilen in das Ergebnis einzubeziehen, die keine verwandten Zeilen in einer anderen Tabelle haben (d. h. alle). Zeilen aus einer Tabelle werden ausgewählt und nur zugehörige Zeilen aus einer anderen Tabelle hinzugefügt. Eine solche Verbindung wird als extern bezeichnet. Hierzu werden die Schlüsselwörter OUTER JOIN ... ON ... mit dem Präfix LEFT oder RIGHT verwendet.
Betrachten wir ein Beispiel, in dem wir zuvor einen neuen Verkäufer – Semuel Piter, der noch keine Verkäufe hat – zur Tabelle Sellers hinzugefügt haben:
Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2
LEFT OUTER JOIN Sumproduct
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name
Mit dieser Anfrage haben wir die Liste aller Verkäufer in der Datenbank extrahiert und die Gesamtmenge der für sie verkauften Waren für alle Monate berechnet. Wir sehen, dass es für den neuen Verkäufer Semuel Piter keine Verkäufe gibt. Wenn wir einen Inner Join verwenden würden, würden wir den neuen Verkäufer nicht sehen, da er keine Datensätze in der Tabelle Sumproduct hat. Wir können die Richtung der Kombination auch nicht nur durch Schreiben ändern LEFT oder RIGHT, sondern auch durch einfaches Ändern der Reihenfolge der Tabellen (d. h. die folgenden beiden Datensätze liefern das gleiche Ergebnis: Sellers LEFT OUTER JOIN Sumproduct und Sumproduct RIGHT OUTER JOIN Sellers).
Außerdem erlauben einige DBMS externe Verknüpfungen in einem vereinfachten Datensatz mit den Zeichen *= und =*, was jeweils LEFT OUTER JOIN und RIGHT OUTER JOIN entspricht. Somit könnte die vorherige Abfrage wie folgt umgeschrieben werden:
SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City
Leider unterstützt MS Access keinen verkürzten Datensatz für einen Outer Join.
Es gibt auch eine andere Art von Outer-Join – einen vollständigen Outer-Join, der alle Zeilen beider Tabellen anzeigt und nur diejenigen verknüpft, die verknüpft werden können. Die Syntax eines vollständigen Outer-Joins lautet wie folgt:
SELECT Seller_name, Product
FROM Sellers
FULL OUTER JOIN Sumproduct
ON Sellers.City = Sumproduct.City
Auch hier wird der vollständige äußere Join von den folgenden DBMS nicht unterstützt: MS Access, MySQL, SQL Server und Sybase. Wie man diese Ungerechtigkeit umgehen kann, werden wir im nächsten Abschnitt betrachten.