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