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:
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.
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.
SELECT rufname, familienname, klasse.name AS klasse FROM schueler, klasse WHERE schueler.klasse_id = klasse.id
AS
-Operator erinnern? AS klasse
bewirkt, dass die betreffende Spalte in der Ergebnistabelle den Namen "klasse" bekommt.