Drei Tabellen verbinden
Manche Fragen brauchen mehr als zwei Tabellen. Welche Spiele waren in welcher Bestellung, und wann wurde sie aufgegeben? Die Titel stehen in spiele, die Daten in bestellungen, und was sie verbindet, ist positionen: Jede ihrer Zeilen hat eine bestellung_id und eine spiel_id. Du verbindest also positionen mit beiden:
SELECT b.id, b.bestellt_am, s.titel, p.menge
FROM positionen AS p
JOIN bestellungen AS b ON p.bestellung_id = b.id
JOIN spiele AS s ON p.spiel_id = s.id
ORDER BY b.id, s.titel;| id | bestellt_am | titel | menge |
|---|---|---|---|
| 1 | 2024-01-20 | Cube Logic | 1 |
| 1 | 2024-01-20 | Moon Farm | 1 |
| 2 | 2024-02-14 | Galaxy Trader | 1 |
| 3 | 2024-02-29 | Ocean Deep | 1 |
| … | … | … | … |
Jedes JOIN fügt eine Tabelle hinzu und hat sein eigenes ON. Du kannst dir vorstellen, dass die Datenbank Schritt für Schritt arbeitet: Das erste JOIN paart jede Position mit ihrer Bestellung, was Zeilen mit den Spalten beider Tabellen ergibt; das zweite JOIN fügt dann jeder dieser Zeilen ihr Spiel hinzu. Am Ende ist jede Zeile des Ergebnisses eine Position, mit den Spalten aller drei Tabellen.
positionen sitzt in der Mitte und verbindet die beiden anderen: Eine Bestellung kann viele Spiele haben, und ein Spiel kann in vielen Bestellungen vorkommen. Eine solche Beziehung heißt n:m-Beziehung (viele zu viele), und eine Datenbank speichert sie in einer Tabelle zwischen den beiden, einer Verbindungstabelle wie positionen. Die Tabelle bewertungen ist von derselben Art: Sie verbindet Spiele mit den Kunden, die sie bewertet haben.
Und du kannst weitermachen. Jede Bestellung hat eine kunde_id, also verbindet eine vierte Tabelle, die Kunden, die Bestellungen mit einer weiteren Zeile:
JOIN kunden AS k ON b.kunde_id = k.idIhr ON benutzt b, eine Tabelle, die schon in der Abfrage ist. Um die Bedingungen zu finden, folge den Fremdschlüsseln, wie du es in der ersten Lektion von Hand getan hast: positionen.bestellung_id → bestellungen.id, bestellungen.kunde_id → kunden.id, positionen.spiel_id → spiele.id. Jeder Schlüssel, dem du folgst, ist ein JOIN, und am übersichtlichsten ist es, die JOINs in der Reihenfolge zu schreiben, in der du ihnen folgst.
Typischer Fehler: die Spalte einer Tabelle, die nicht in der Abfrage ist. Wenn du k.name in SELECT schreibst, aber vergisst, kunden zu verbinden, bekommst du den Fehler no such column: k.name. Der Alias existiert erst, wenn die Tabelle verbunden ist.
So schreibst du es:
Anweisungen
- 1
Zeige, wer welches Spiel bewertet hat: Verbinde
bewertungenmitspieleund mitkundenund zeige dentiteldes Spiels, dennamedes Kunden und diesterne. Sortiere die Zeilen nachtitel, dann nachname:titel name sterne Bakery Story Mia Lange 4 Cube Logic Emma Becker 3 Cube Logic Olivia Braun 5 Dragon Forge Anna Fischer 3 … … … - 2
Schreibe darunter eine Abfrage, die zeigt, was jeder Kunde gekauft hat, aus vier Tabellen: den
namedes Kunden, das Datum der Bestellung (bestellt_am) und dentiteldes Spiels. Sortiere die Zeilen nachname, dann nachbestellt_am, dann nachtitel:name bestellt_am titel Anna Fischer 2024-05-11 Pixel Racer Anna Fischer 2025-04-15 Dragon Forge Emma Becker 2024-01-20 Cube Logic Emma Becker 2024-01-20 Moon Farm Emma Becker 2024-03-15 Dragon Forge … … …