Relationale Datenbanken bestehen in der Praxis in der Regel aus mehreren, oft weit über einhundert verschiedenen Tabellen. Anfragen an Datenbanken müssen daher mehrere Tabellen berücksichtigen. Dazu werden Verbundmengen und Mengenoperationen eingesetzt. Darüber hinaus können komplexe Datenbankanfragen so gespeichert werden, dass sie mehrfach wiederverwendet werden können.
In der Regel ist der Datenbestand in relationalen Datenbanken über mehrere Tabellen verteilt. Um dennoch gezielt Informationen aus dem
Datenbestand abzufragen, die sich über mehrere Tabellen verteilen, werden Verbundmengen (engl.: join) eingesetzt. Die Grundidee
hinter den Verbundmengen ist die Erzeugung einer neuen Relation aus mehreren bereits bestehenden Relationen. Das
SELECT-Statement wird zur Erzeugung einer Ergebnistabelle aus einer Datenbanktabelle genutzt. Mit den im
Folgenden vorgestellten Verbundmengen können in einer virtuellen Tabelle auch gezielte Informationen aus mehreren Datenbanktabellen
zusammengestellt werden.
Folgendes Beispiel veranschaulicht die Arbeitsweise einer Verbundmenge: in einer Datenbank befinden sich zwei Tabellen Artikel und Film, wobei das Attribut ArtikelID der Tabelle Film ein Fremdschlüssel ist, der das Attribut ArtikelID der Tabelle Artikel referenziert:
| Artikel | ||||
|---|---|---|---|---|
| ArtikelID | ArtikelNR | Preis | Name | Verfuegbarkeit |
| 1 | UZEHN78126 | 10.99 | Auf dem Weg ins Nichts | sofort |
| 2 | ZHBH789123 | 13.99 | Hinter uns | sofort |
| 5 | KJNSM7873 | 9.99 | Help you | in 3 Tagen |
| 6 | UIHJKHSD7 | 8.99 | Around the Planet | in 2 Tagen |
| Film | |||||||
|---|---|---|---|---|---|---|---|
| FilmID | Regisseur | Sprachen | Untertitel | AnzahlDiscs | Studio | Medium | ArtikelID Artikel -> ArtikelID |
| 3 | Sophie Little |
DE, EN, FR | DE, EN | 1 | DreamPictures | DVD | 1 [>] |
| 4 | Fred van Heldt |
EN, FR | EN, FR, DE | 2 | MovieFactory | DVD | 2 [>] |
Gesucht werden alle Filme, die mit Namen, Regisseur, Preis und Verfügbarkeit ausgegeben werden sollen.
Mit Hilfe eines Verbundes werden beide Tabellen Artikel und Film zu einer Tabelle zusammengeführt (auch: verbunden). Die so entstandene
neue Tabelle hat als Spalten alle Spalten von Artikel und Film zusammen.

Bei der Zusammenführung von Tabellen werden auch die Datensätze zusammengeführt. Da jede Zeile einer Tabelle einem Datensatz
entspricht, muss bei einem Verbund festgelegt werden, welche Datensätze jeweils verbunden werden sollen. Dazu muss ein
Verbundkriterium bestimmt werden. Im Beispiel werden die Datensätze verbunden, die jeweils einen gleichen Wert in der Spalte ArtikelID
haben. Hat ein Datensatz der Tabelle Artikel die gleiche ArtikelID wie ein Datensatz in Film, so werden diese Datensätze in der neuen
Tabelle zusammengefasst. Das formale Vergleichskiterium ist daher
Artikel.ArtikelID = Film.ArtikelID.
Nach der Zusammenführung der Datensätze sieht die Ergebnistabelle wie folgt aus:

Da allerdings nicht alle Angaben zu jedem Film gesucht werden, sondern nur die Attribute Namen, Regisseur, Preis und Verfuegbarkeit, werden nur die gewünschten Spalten in der Verbundmenge ausgewählt und in der richtigen Reihenfolge dargestellt. Alle anderen Spalten werden nicht benötigt. Daher sieht das Ergebnis der Anfrage wie folgt aus:
| Name | Regisseur | Preis | Verfuegbarkeit |
| Auf dem Weg ins Nichts | Sophie Little | 10.99 | sofort |
| Hinter uns | Fred van Heldt | 13.99 | sofort |
Die SQL-Syntax zu dem gerade beschriebenen Beispiel wird in der folgenden Abbildung gezeigt und erläutert.

In relationalen Datenbanken werden verschiedene Typen von Verbünden unterschieden. Neben dem inneren Verbund (engl.: inner join) werden
häufig auch der natürliche Verbund (engl.: natural join), der linke Verbund (engl.: left join) und der rechte Verbund (engl.: right
join) eingesetzt. Anhand der in folgender Abbildung gezeigten Beispieldatenbank werden die wichtigsten Typen von Verbünden
dargestellt.

Das Verhalten der unterschiedlichen Verbundtypen wird in der folgenden Tabelle jeweils anhand eines konkreten Anwendungsbeispiel erläutert.
| Verbundtyp mit SQL-Statement | Verhalten |
INNER JOIN mit ON VerbundkriteriumSELECT * FROM Artikel |
Führt alle Datensätze zusammen, zu denen das Verbundkriterium erfüllt ist. Alle Spalten aller Tabellen sind im Ergebnis enthalten. ![]() |
| INNER JOIN mit USING(spalten); wird eingesetzt, wenn die Spalten des Verbundkriteriums gleich benannt sind. SELECT * FROM Artikel |
Führt alle Datensätze zusammen, deren Werte in allen Spalten, die als Parameter von USING genannt wurden, übereinstimmen. Die Vergleichsspalten sind nur einmal in der Ergebnistabelle vorhanden. ![]() |
INNER JOIN wird häufig als JOIN, d.h., ein
JOIN-Befehl ohne genauere Spezifizierung ist ein
INNER. |
|
| NATURAL JOIN: Variante vom INNER JOIN SELECT * FROM Artikel |
Vergleicht die Datensätze aller Spalten mit dem gleichen Spaltennamen. Im Beispiel die Spalten ArtikelID und Zahl. Nur bei einer vollständigen Übereinstimmung wird der Datensatz in die Ergebnis- tabelle aufgenommen. Die gleichnamigen Spalten sind nur einmal im Ergebnis vorhanden. ![]() |
Statt ON kann auch bei LEFT JOIN und
RIGHT JOIN die JOIN-Bedingung mit
USING angegebenwerden. |
|
LEFT JOINSELECT * FROM Artikel |
Führt alle Datensätze zusammen, zu denen das Verbundkriterium erfüllt ist. Alle Spalten aller Tabellen sind im Ergebnis enthalten. Darüber hinaus werden alle Datensätze der links vom JOIN-Statement genannten Tabellen (hier Artikel)in das Ergebnis übernommen. Die aus der rechten Tabelle übernommenen Spalten werden mit NULL aufgefüllt. ![]() |
RIGHT JOINSELECT * FROM Artikel |
Führt alle Datensätze zusammen, zu denen das Verbundkriterium erfüllt ist. Alle Spalten aller Tabellen sind im Ergebnis enthalten. Darüber hinaus werden alle Datensätze der rechts vom JOIN-Statement genannten Tabellen (hier Film)in das Ergebnis übernommen. Die aus der linken Tabelle übernommenen Spalten werden mit NULL aufgefüllt. ![]() |
Mit dem Einsatz von Verbünden ändert sich die Struktur des SELECT-Statements nicht
grundlegend. Auch die Ergebnismenge eines Verbundes lässt sich mit GROUP BY gruppieren und mit
ORDER BY sortieren.
Folgendes Beispiel ermittelt die Anzahl sofort verfügbarer Filme, die auf mehr als 1 Disc ausgeliefert werden, gruppiert nach der Anzahl der Discs:
SQL-Statement
SELECT AnzahlDiscs, COUNT(*) AS Anzahl
FROM Artikel NATURAL JOIN Film
WHERE Verfuegbarkeit = 'sofort' AND AnzahlDiscs > 1
GROUP BY AnzahlDiscs;
Eine mittlerweile veraltete Alternative, innere Verbünde zu erhalten, kann wie in der folgenden Tabelle mit dem Schlüsselwort
WHERE umgesetzt werden. Diese Variante liefert zwar dasselbe Ergebnis wie INNER
JOIN, vermischt allerdings das Verbundkriterium und die Filterbedingung und gilt daher als schlechter Programmierstil.
| Verbundtyp mit SQL-Statement | Verhalten |
INNER JOIN mit WHERESELECT * FROM Artikel, Film |
Erstellt ein Ergebnis mit allen Datensätzen aus Artikel und Film, für die mit WHERE formulierteBedingung erfüllt ist. ![]() |