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

Geschafft! :-)

  • 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.