Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Datenmodellierung und Datenbanksysteme

Komplexe Datenbankabfragen auf mehrere Tabellen

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.

Verbundmengen (JOIN)

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.

Grundprinzip von Verbundmengen

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.
Abbildung: Spalten der verbundenen Tabellen Artikel und Film

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:
Abbildung: Verbundene Tabellen Artikel und Film

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.
Abbildung: SQL-Beispiel für eine Verbundmenge

Verbundtypen

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.
Abbildung: Beispieldatenbank zur Veranschaulichung von Verbünden

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 Verbundkriterium
SELECT * FROM Artikel
INNER JOIN Film ON
Artikel.ArtikelID = Film.ArtikelID;
Führt alle Datensätze zusammen, zu denen das
Verbundkriterium erfüllt ist.
Alle Spalten aller Tabellen sind im Ergebnis enthalten.
Abbildung: INNER JOIN
INNER JOIN mit USING(spalten); wird
eingesetzt, wenn die Spalten des
Verbundkriteriums gleich benannt sind.
SELECT * FROM Artikel
INNER JOIN Film USING(ArtikelID);
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.
Abbildung: INNER JOIN mit USING
INNER JOIN wird häufig als JOIN, d.h., ein JOIN-Befehl ohne genauere Spezifizierung ist ein INNER
JOIN
.
NATURAL JOIN: Variante vom INNER
JOIN
SELECT * FROM Artikel
NATURAL JOIN Film;
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.
Abbildung: NATURAL JOIN
Statt ON kann auch bei LEFT JOIN und RIGHT JOIN die JOIN-Bedingung mit USING angegeben
werden.
LEFT JOIN
SELECT * FROM Artikel
LEFT JOIN Film ON
Artikel.ArtikelID = Film.ArtikelID;
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.
Abbildung: LEFT JOIN
RIGHT JOIN
SELECT * FROM Artikel
RIGHT JOIN Film ON
Artikel.ArtikelID = Film.ArtikelID;
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.
Abbildung: RIGHT JOIN

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;

Verknüpfung mit WHERE

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 WHERE
SELECT * FROM Artikel, Film
WHERE
Artikel.ArtikelID = Film.ArtikelID;
Erstellt ein Ergebnis mit allen Datensätzen aus
Artikel und Film, für die mit WHERE formulierte
Bedingung erfüllt ist.
Abbildung: INNER JOIN