Mehrere Tabellen
Ein besonderes Merkmal von relationalen Datenbanken und damit von SQL ist, dass die Informationen fast immer über mehrere Tabellen verteilt sind und bei Abfragen in der Ergebnismenge zusammengeführt werden müssen. Dieses Kapitel gibt einen Überblick über die Möglichkeiten dazu; Einzelheiten stehen in den folgenden Kapiteln.
Schreibweisen bei mehreren Tabellen
[Bearbeiten]Bitte beachten Sie bei allen Befehlen, die mehrere Tabellen verwenden (das sind zwangsläufig nur SELECT-Befehle):
- Wenn ein Spaltenname in Bezug auf den gesamten SQL-Befehl eindeutig ist, genügt dieser Name.
- Wenn ein Spaltenname mehrfach vorkommt (wie ID), dann muss der Tabellenname vorangesetzt werden; der Spaltenname wird nach einem Punkt angefügt.
SELECT
Personalnummer AS MitNr,
Name, Vorname,
Dienstwagen.ID, Kennzeichen, Fahrzeugtyp_ID AS Typ
FROM Mitarbeiter, Dienstwagen;
- Wegen der Übersichtlichkeit wird die Tabelle meistens auch dann bei jeder Spalte angegeben, wenn es wegen der ersten Regel nicht erforderlich wäre.
SELECT
Mitarbeiter.Personalnummer AS MitNr,
Mitarbeiter.Name, Mitarbeiter.Vorname,
Dienstwagen.ID AS DIW, Dienstwagen.Kennzeichen, Dienstwagen.Fahrzeugtyp_ID AS Typ
FROM Mitarbeiter, Dienstwagen;
- Anstelle des Namens einer Tabelle kann überall auch ein Tabellen-Alias benutzt werden; dieser muss einmal hinter ihrem Namen (in der FROM- oder in der JOIN-Klausel) angegeben werden.
SELECT
mi.Personalnummer AS MitNr,
mi.Name, mi.Vorname,
dw.ID AS DIW, dw.Kennzeichen, dw.Fahrzeugtyp_ID AS Typ
FROM Mitarbeiter mi, Dienstwagen dw;
Alle diese Befehle für „Liste der Mitarbeiter mit Dienstwagen“ sind gleichwertig. Zu empfehlen ist die vollständige Schreibweise mit Alias wie im vorigen Beispiel.
Ein ähnlicher Befehl unter Verwendung der JOIN-Klausel sieht dann so aus:
SELECT
mi.Personalnummer AS MitNr,
mi.Name, mi.Vorname,
dw.ID AS DIW, dw.Kennzeichen, dw.Fahrzeugtyp_ID AS Typ
FROM Mitarbeiter mi
JOIN Dienstwagen dw on mi.ID = dw.Mitarbeiter_ID;
Der Alias ist nur für den betreffenden SQL-Befehl gültig. Ein und dieselbe Tabelle kann mal als 'a', dann als 'mi' oder auch als 'xyz' bezeichnet werden. Wegen des leichteren Verständnisses sind aussagefähige Kürzel sinnvoll; auch deshalb sind sie im Kapitel Tabellenstruktur der Beispieldatenbank angegeben.
Verknüpfung über WHERE – der traditionelle Weg
[Bearbeiten]Beim einfachsten Verfahren, mehrere Tabellen gleichzeitig abzufragen, stehen alle Tabellen in der FROM-Klausel; die WHERE-Klausel enthält neben den Auswahlbedingungen auch Bedingungen zur Verknüpfung der Tabellen.
Einzelheiten werden in Einfache Tabellenverknüpfung behandelt.
JOINs - der moderne Weg
[Bearbeiten]Beim „modernen“ Weg, mehrere Tabellen in einer gemeinsamen Abfrage zu verknüpfen, wird jede Tabelle in einer JOIN-Klausel aufgeführt; der ON-Parameter enthält die Verknüpfungsbedingung. Die WHERE-Klausel enthält nur die Auswahlbedingungen.
Die Einführung dazu wird in Arbeiten mit JOIN besprochen.
OUTER JOIN - auch null-Werte zurückgeben
[Bearbeiten]Bei Abfragen mit einem „einfachen“ JOIN werden nicht alle Datensätze aufgeführt. Zeilen, zu denen es in der einen oder anderen Tabelle keine Verknüpfung gibt, fehlen im Ergebnis. Mit einem OUTER JOIN können auch solche „fehlenden“ Zeilen aufgeführt werden.
Einzelheiten dazu werden in OUTER JOIN behandelt.
Weitere Möglichkeiten von JOIN
[Bearbeiten]Als SELF JOIN wird eine Tabelle mit sich selbst verknüpft.
Oft kommt es vor, dass man die Daten aus einer Tabelle erst bearbeiten möchte, bevor man sie mit einer anderen Tabelle verknüpft. Dazu gibt es die Möglichkeit einer „Inline-View“.
Diese Ergänzungen werden in Mehr zu JOIN besprochen.
Zusammenfassung
[Bearbeiten]In diesem Kapitel erhielten wir Hinweise darauf, wie mehrere Tabellen verknüpft werden können:
- einfach über die FROM-Klausel und passende WHERE-Bedingungen
- übersichtlich über die JOIN-Klausel mit verschiedenen Varianten
Übungen
[Bearbeiten]
Übung 1 | Was ist an diesem SELECT-Befehl falsch? | Zur Lösung |
Zeigen Sie zu bestimmten Versicherungsverträgen die Daten der Fahrzeuge an.
select ID, Abschlussdatum, Art,
vv.Kennzeichen, Farbe
from Versicherungsvertrag vv, Fahrzeug
where vv.Fahrzeug_ID = Fahrzeug.ID
and Kennzeichen LIKE 'BO%';
Übung 2 | Was ist an diesem SELECT-Befehl falsch? | Zur Lösung |
Zeigen Sie zu einem Versicherungsvertrag die Daten des Versicherungsnehmers und des Sachbearbeiters an.
select ID, Vorname + ' ' + Name AS Kunde, Ort
Name AS Sachbearbeiter, Telefon
from Versicherungsvertrag, Versicherungsnehmer, Mitarbeiter
where ID = 27
and Versicherungsvertrag.Versicherungsnehmer_ID = Versicherungsnehmer.ID
and Versicherungsvertrag.Mitarbeiter_ID = Mitarbeiter.ID;
Übung 3 | Berichtigen Sie den folgenden SELECT-Befehl. | Zur Lösung |
Zeigen Sie zu jedem Mitarbeiter die Daten seines Dienstwagens (Kennzeichen, Typ, Hersteller) an.
select ID, Name, Vorname,
Kennzeichen, Bezeichnung, Name
from Mitarbeiter mi, Dienstwagen dw,
Fahrzeugtyp ft, Fahrzeughersteller fh
where ID = dw.Mitarbeiter_ID
and ID = dw.Fahrzeugtyp_ID
and ID = ft.Hersteller_ID
order by Name, Vorname;
Lösungen
[Bearbeiten]
Lösung zu Übung 1 | Was ist an diesem SELECT-Befehl falsch? | Zur Übung |
- Die ID muss mit Tabellennamen oder Alias versehen sein, weil sie in beiden Tabellen enthalten ist.
- Die Spalte Kennzeichen gehört zur Tabelle Fahrzeug, also ist der Alias vv falsch.
Lösung zu Übung 2 | Was ist an diesem SELECT-Befehl falsch? | Zur Übung |
- Die ID muss sowohl in der Spaltenliste als auch in der WHERE-Klausel mit Tabellennamen oder Alias versehen sein, weil sie in allen Tabellen enthalten ist.
- Gleiches gilt für Name und Vorname, weil diese Angaben in mehreren Tabellen enthalten sind.
Wenn (wie in den Anmerkungen zur Beispieldatenbank erwähnt) auch für die Kunden Kontaktdaten gespeichert wären, müsste das auch bei der Spalte Telefon beachtet werden. Für die Spalte Ort gilt das nicht, weil diese nicht zur Tabelle Mitarbeiter gehört, sondern zur Tabelle Abteilung, die hier nicht benutzt wird.
Lösung zu Übung 3 | Berichtigen Sie den folgenden SELECT-Befehl. | Zur Übung |
select mi.ID, mi.Name, mi.Vorname,
dw.Kennzeichen, ft.Bezeichnung, fh.Name
from Mitarbeiter mi, Dienstwagen dw,
Fahrzeugtyp ft, Fahrzeughersteller fh
where mi.ID = dw.Mitarbeiter_ID
and ft.ID = dw.Fahrzeugtyp_ID
and fh.ID = ft.Hersteller_ID
order by mi.Name, mi.Vorname;
Siehe auch
[Bearbeiten]Selfhtml: JOIN – eine andere Beschreibung und Beispielserie zum JOIN-Befehl.