Zum Hauptinhalt springen

Mehrtabellenabfragen (Joins)

Datenbanken können nicht nur zum effizienten aufbewahren von Daten verwendet werden, sondern auch um die gespeicherten Tabellen miteinander zu verknüpfen. Die Verknüpfung basiert auf dem kartesischen Produkt, daher "Jede Zeile einer Tabelle wird mit jeder Zeile der anderen Tabelle verknüpft".

Definition

Das kartesische Produkt AxB (lies „A kreuz B“) zweier Mengen A und B ist definiert als die Menge aller geordneten Paare (a,b), wobei a ein Element aus A und b ein Element aus B ist. Dabei wird jedes Element aus A mit jedem Element aus B kombiniert. Formal ist das kartesische Produkt durch

A×B={(a,b)aAbB}A\times B=\{(a,b)|a\in A\land b\in B\}

definiert.

Umgangssprachlich

Umgangssprachlich ist das kartesische Produkt bekannt als Jedes mit Jedem

A={a,b,c}A=\{a,b,c\}

B={1,2}B=\{1,2\}
A×B={(a,1),(a,2),(b,1),(b,2),(c,1),(c,2)}A\times B=\{(a,1),(a,2),(b,1),(b,2),(c,1),(c,2)\}

Beispiele

Personen

NameVornameAugenfarbe
MäderElisabethgrün
HolzerRetobraun

Augenfarben

FarbeAuftreten [%]
blau2
grün7
braun90

Das kartesische Produkt der Tabellen Personen und Augenfarbe sieht wie folgt aus:

NameVornameAugenfarbeFarbeAuftreten [%]
MäderElisabethgrünblau2
HolzerRetobraunblau2
MäderElisabethgrüngrün7
HolzerRetobraungrün7
MäderElisabethgrünbraun90
HolzerRetobraunbraun90

SQL

Verschiedene Tabellen

Die Abfrage

SELECT * FROM legodudes, haustiere;

erzeugt das kartesische Produkt der Tabellen legodudes und haustiere. Allerdings ist das Resultat nicht wie erwartet - so gibt es bspw. nur eine Spalte mit einem Bild:

Gleiche Attributnamen in verschiedenen Tabellen

Werden mehrere Tabellen mit denselben Attributnamen verknüpft, so werden die Spalten zusammengefasst und der zuletzt hinzugefügte Wert wird verwendet.

Alias

Es müssen Aliase verwendet werden, damit dieselbe Tabelle miteinander verknüpft werden können:

SELECT 
legodudes.name AS "Name", legodudes.bild AS "Bild",
haustiere.name AS "Haustier", haustiere.bild AS "Vorschau"
FROM legodudes, haustiere
Weniger Schreiben: Tabellennamen abkürzen

Da bei jeder Spalte der Tabellenname angegeben werden muss, lassen sich die Tabellennamen mit einem Alias abzukürzen:

SELECT 
a.name AS "Name", a.bild AS "Bild", b.name AS "Haustier", b.bild AS "Vorschau"
FROM legodudes a, haustiere b

Oft interessiert aber nicht das kartesische Produkt, sondern eine Verknüpfung zwischen einzelnen Zeilen. Dies kann mit einer WHERE Bedingung erfüllt werden.

Beispiel: LegoDudes und Haustiere

SELECT 
a.name AS "Name", a.bild AS "Bild", b.name AS "Haustier", b.bild AS "Vorschau"
FROM legodudes a, haustiere b
WHERE a.id = b.legodude_id
Geordnete Ausgabe

Die Tabellennamen müssen bei jeder Attributverwendung angegeben werden (ausnahme: die Spalten haben unterschiedliche Namen). Dies also auch bspw. beim Filtern:

SELECT 
a.name AS "Name", a.bild AS "Bild", b.name AS "Haustier", b.bild AS "Vorschau"
FROM legodudes a, haustiere b
WHERE a.id = b.legodude_id
ORDER BY a.name

Joins

Da sehr oft Tabellen miteinander verknüpft werden müssen und die Abfragen mit dem kartesischen Produkt sehr unübersichtlich werden, gibt es die Möglichkeit, die Tabellen mit einem JOIN zu verknüpfen.

Obiges Beispiel sähe mit einem JOIN so aus:

SELECT 
legodudes.name AS "Name", legodudes.bild AS "Bild", haustiere.name AS "Haustier", haustiere.bild AS "Vorschau"
FROM legodudes
JOIN haustiere ON legodudes.id = haustiere.legodude_id
ORDER BY legodudes.name
Legodudes Freunde

Erzeugen Sie eine Abfrage, die alle Legodudes mit ihren Freunden anzeigt, wobei nach dem Namen und dann nach Freundenamen sortiert wird.

tip

Es können mehrere JOINS nacheinander verwendet werden:

SELECT *
FROM tab_a
JOIN tab_b ON tab_a.id = tab_b.a_id
JOIN tab_c ON tab_b.id = tab_c.b_id
SSR

Was ist mit "Larry" und "Wigwam" passiert? Warum werden diese nicht angezeigt? Vermutung?

IMDb

Bei welchen Filmen wirkt

Geben Sie die Personen zusammen mit den Filmen aus, in welchen sie mitwirken.

SSR
Lieblingsfilme

Wer wirkt alles bei Ihrem Lieblingsfilm (alternativ: vom Film mit der ID tt0478087) mit? Geben Sie den Film zusammen mit allen Personen aus, die beim Film mitgewirkt haben.

SSR