Inhaltsverzeichnis
10.3 Joinen von Tabellen
Wir arbeiten im Folgenden mit einer Schul-Datenbank. Dort gibt es die Tabellen Schueler und Klasse, deren Tabellenschemata ausschnittsweise so aussehen:
Hier ein paar Beispieldaten:
Vorhaben:
Wir wollen eine SQL-Abfrage erstellen, die uns die Namen der Schüler zusammen mit ihrer Klasse zurückgibt, also so:
Lösung:
1. Schritt: Wir bilden das kartesische Produkt
SELECT rufname, familienname, schueler.klasse_id, klasse.id, klasse.name FROM schueler, klasse
Seltsam: Was wird das Datenbankmanagementsystem machen, wenn wir im from
-Teil der Abfrage zwei Tabellen angeben?
Das Ergebnis sieht so aus:
Gibt man im from
-Teil einer select
-Abfrage mehrere Tabellen kommasepariert an, so bildet das Datenbank-Management-System das kartesische Produkt der Tabellen. Das heißt, es verknüpft jeden Datensatz der 1. Tabelle mit jedem der 2. Tabelle, jeden dieser wiederum mit jedem der 3. Tabelle usw.
2. Schritt: Wir wählen uns diejenigen Zeilen aus, die sinnvoll sind
Beim Bilden des kartesischen Produkts berücksichtig das Datenbankmanagementsystem den über die Spalten schueler.klasse_id und klasse.id gegebenen Zusammenhang der beiden Tabellen nicht. Das kartesische Produkt enthält daher sinnvolle (grün) und nicht-sinnvolle (orange) Kombinationen der Datensätze beider Tabellen:
Die sinnvollen sind diejenigen, bei denen schueler.klasse_id = klasse.id
ist. Wir filtern sie heraus, indem wir eine geeignete where
-Bedingung formulieren:
SELECT rufname, familienname, schueler.klasse_id, klasse.id, klasse.name FROM schueler, klasse WHERE schueler.klasse_id = klasse.id
Jetzt sieht die Ergebnistabelle schon besser aus:
Man nennt die Auswahl der Datensätze mithilfe einer where
-Bedingung Selektion.
3. Schritt: Auswahl und Benennung der gewünschten Spalten
SELECT rufname, familienname, klasse.name AS klasse FROM schueler, klasse WHERE schueler.klasse_id = klasse.id
- Die Auswahl der Spalten nennt man Projektion.
- Kannst Du Dich noch an den
AS
-Operator erinnern?AS klasse
bewirkt, dass die betreffende Spalte in der Ergebnistabelle den Namen "klasse" bekommt.