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
definiert.
Umgangssprachlich ist das kartesische Produkt bekannt als Jedes mit Jedem
Beispiele
Personen
Name | Vorname | Augenfarbe |
---|---|---|
Mäder | Elisabeth | grün |
Holzer | Reto | braun |
Augenfarben
Farbe | Auftreten [%] |
---|---|
blau | 2 |
grün | 7 |
braun | 90 |
Das kartesische Produkt der Tabellen Personen
und Augenfarbe
sieht wie folgt aus:
Name | Vorname | Augenfarbe | Farbe | Auftreten [%] |
---|---|---|---|---|
Mäder | Elisabeth | grün | blau | 2 |
Holzer | Reto | braun | blau | 2 |
Mäder | Elisabeth | grün | grün | 7 |
Holzer | Reto | braun | grün | 7 |
Mäder | Elisabeth | grün | braun | 90 |
Holzer | Reto | braun | braun | 90 |
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:
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
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
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:
- Explizit
- Kurz
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
SELECT
a.name AS "Name", a.bild AS "Bild", b.name AS "Haustier", b.bild AS "Vorschau"
FROM legodudes a
JOIN haustiere b ON a.id = b.legodude_id
ORDER BY a.name
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
Erzeugen Sie eine Abfrage, die alle Legodudes mit ihren Freunden anzeigt, wobei nach dem Namen und dann nach Freundenamen sortiert wird.
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
Was ist mit "Larry" und "Wigwam" passiert? Warum werden diese nicht angezeigt? Vermutung?
Bei welchen Filmen wirkt
-
Balthasar Glättli mit?
-
Ihre Lieblingsschauspieler:in mit?
Geben Sie die Personen zusammen mit den Filmen aus, in welchen sie mitwirken.
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.
Mehrtabellenabfragen (Joins)