====== 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:
{{ :jg10:join:pasted:20220911-162203.png?400 }}
Hier ein paar Beispieldaten:
{{ :jg10:einszun:pasted:20220911-154924.png?400 }}
\\ \\
**Vorhaben:** \\
Wir wollen eine SQL-Abfrage erstellen, die uns die Namen der Schüler zusammen mit ihrer Klasse zurückgibt, also so:
{{ :jg10:einszun:pasted:20220911-155044.png?300 }}
===== 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:
{{ :jg10:einszun:pasted:20220911-155804.png?400 }}
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:
{{ :jg10:einszun:pasted:20220911-160446.png?300 }}
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:
{{ :jg10:einszun:pasted:20220911-160749.png?300 }}
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
{{ :jg10:einszun:pasted:20220911-160951.png?300 }}
**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.