SQL-Abfragen über mehrere Tabellen hinweg
Die Abfragen, welche wir bislang erstellt haben, bezogen sich allesamt auf jeweils nur eine Tabelle. Gerade im Hinblick auf die vielen Tabellen, aus welchen relationale Datenbanken in der Regel bestehen, bieten Abfragen ein mächtiges Werkzeug, die Datenbestände über mehrere Tabellen hinweg nach bestimmten Kriterien zu durchsuchen und das Ergebnis anzuzeigen.
Um uns die bestimmten Bedingungen vor Augen zu führen, die notwendig sind, damit das jeweilige Abfrageergebnis auch korrekt i.S.v. plausibel ist, verlassen wir kurz die SQL-Umgebung, um zur Veranschaulichung in die QBE zu wechseln.
Mit Hilfe der nächsten Abfrage wollen wir uns die SchülerInnen mit deren jeweiligem Wohnort anzeigen lassen. Hierzu gehen wir wie im ersten Beispiel vor, nur dass wir jetzt mehrere Tabellen auswählen müssen:

Es sollen der Name sowie der Vorname als auch der Ort angezeigt werden. Die drei Attribute, welche sich in verschiedenen Tabellen befinden, wählen wir jetzt aus:




Das Ergebnis überrascht uns in zweierlei Hinsicht:
- Obwohl die gesamte Datenbank nur 28 Schüler enthält (siehe Abb. 3), werden durch die Abfrage 364 Datensätze angezeigt. Multipliziert man die Anzahl der Schülerdatensätze mit der Anzahl der gespeicherten Orte (siehe Abb. 4), so erhält man ebenfalls den Wert 364. Das hat folgende Ursache:
- Jeder der angezeigten Schüler wird in Kombination mit allen in der Datenbank vorhandenen Ortsnamen angezeigt. Das Ergebnis einer solchen Abfrage nennt man Kreuzprodukt.
Im Folgenden wollen wir die Hintergründe für das Abfrageergebnis untersuchen. Hierzu klicken wir im Reiter „Datenbanktools“ auf das Symbol „Beziehungen“:

Wir erkennen, dass zwischen den Tabellen „tbl_schüler“ und „tbl_ort“ keine direkte Beziehung besteht, sondern dass die Tabelle „tbl_plz“ zwischen den beiden erstgenannten steht. Aufgrund dieser Erkenntnis fügen wie die Tabelle „tbl_plz“ in die Abfrage mit ein, indem wir im Kontextmenü (rechte Maustaste) „Tabelle anzeigen…“ auswählen:

Haben wir die zusätzliche Tabelle hinzugefügt, so erkennen wir, dass alle in der Abfrage befindlichen Tabellen nun miteinander verbunden sind:

Betrachten wir uns jetzt das Abfrageergebnis:

Es handelt sich bei der Abfrage bzw. deren Ergebnis nun um einen sog Join, bei welchem alle beteiligten Tabellen miteinander verbunden sind.
Halten wir fest: Während im Rahmen des Kreuzproduktes alle Datensätze der beteiligten Tabellen miteinander kombiniert werden, stellt der Join alle Datensätze mit den zugehörigen Attributen aus der/den verbundenen Tabelle(n) dar.
Nachdem wir uns die Hintergründe für Kreuzprodukt und Join mit Hilfe der grafischen Oberfläche von MS Access vor Augen geführt haben, wechseln wir abermals zu SQL, um dort eine Abfrage über mehrere Tabellen hinweg in Form eines Joins zu formulieren:
Die eingangs gestellte Aufgabe übernehmen wir: Es sollen alle SchülerInnen mit Name und Vorname sowie dem jeweiligen Wohnort angezeigt werden.
Der SQL-Code sieht folgendermaßen aus:
SELECT tbl_schüler.name, tbl_schüler.vorname, tbl_ort.ortsbezeichnung
FROM tbl_schüler, tbl_plz, tbl_ort
WHERE tbl_schüler.plz_nr = tbl_plz.plz_id AND tbl_plz.orts_nr = tbl_ort.orts_id;
In der letzten Zeile wird deutlich, wie die Verbindung zwischen den Tabellen und damit der Join erstellt wird: Es werden die Fremdschlüssel der Sohntabelle mit dem Primärschlüssel der jeweiligen Vatertabelle durch ein „=“-Zeichen miteinander verbunden.
An diesem Beispiel wird deutlich, wie sinnvoll eine konsequente Nomenklatur in der Datenbank ist. So lassen sich durch die Suffixe „id“ und „nr“ relativ leicht die Primär- von den Fremdschlüsseln unterscheiden.
Zum Abschluss ergänzen wir die Abfrage bzw. deren SQL-Code um die Bedingung, dass nur diejenigen SchülerInnen angezeigt werden sollen, deren Wohnort Nürnberg ist:
SELECT tbl_schüler.name, tbl_schüler.vorname, tbl_ort.ortsbezeichnung
FROM tbl_schüler, tbl_plz, tbl_ort
WHERE tbl_ort.ortsbezeichnung=“Nürnberg” AND tbl_schüler.plz_nr=tbl_plz.plz_id AND tbl_plz.orts_nr=tbl_ort.orts_id;
In der WHERE-Anweisung haben wir die Bedingung für den Wohnort Nürnberg den Bedingungen für den Join voran gesttellt.
Das Ergebnis sieht dann folgendermaßen aus:

Anmerkung: MS Access generiert auf der Basis der in der QBE gemachten Eingaben meist einen anderen (komplexeren) Code, welcher jedoch zu den selben Ergebnissen führt.
Im Rahmen der Aufgaben zu diesem Kapitel können Sie Ihre erworbenen Kompetenzen in Bezug auf SQL-Abfragen über mehrere Tabellen hinweg erproben.