Joins mit WHERE und ORDER BY
Ein Join lässt sich mit allem kombinieren, was du kennst: WHERE, ORDER BY, LIMIT und Funktionen. WHERE und ORDER BY kommen nach den Joins und können die Spalten aller verbundenen Tabellen benutzen. Welche Spiele waren in erstatteten Bestellungen?
SELECT b.id, b.bestellt_am, s.titel
FROM positionen AS p
JOIN bestellungen AS b ON p.bestellung_id = b.id
JOIN spiele AS s ON p.spiel_id = s.id
WHERE b.status = 'erstattet'
ORDER BY b.bestellt_am, s.titel;| id | bestellt_am | titel |
|---|---|---|
| 7 | 2024-06-01 | Shadow Ninja |
| 18 | 2025-03-28 | Galaxy Trader |
Erinnere dich aus der Lektion über das Gruppieren an die Reihenfolge, in der die Teile einer Abfrage laufen. Zuerst kommt FROM, jetzt mit allen seinen JOINs: Sie bauen die verbundenen Zeilen auf. Dann behält WHERE einige davon, und danach kommen GROUP BY, HAVING, SELECT, ORDER BY und LIMIT. WHERE und ORDER BY sehen also die Spalten jeder verbundenen Tabelle, ob du sie anzeigst oder nicht. Die Abfrage oben filtert nach b.status und sortiert nach b.bestellt_am, und sie würde auch funktionieren, wenn keine der beiden Spalten in SELECT stünde.
Ein Join lässt dich auch die Spalten zweier Tabellen miteinander vergleichen, was keine Abfrage auf einer Tabelle kann. Welche Positionen wurden für weniger verkauft als der Preis des Spiels im Katalog?
SELECT p.bestellung_id, s.titel, s.preis AS listenpreis, p.preis AS gezahlt
FROM positionen AS p
JOIN spiele AS s ON p.spiel_id = s.id
WHERE p.preis < s.preis
ORDER BY p.bestellung_id, s.titel;| bestellung_id | titel | listenpreis | gezahlt |
|---|---|---|---|
| 28 | Shadow Ninja | 25 | 15 |
| 28 | Zombie Town | 30 | 20 |
Nur die zwei Spiele der Black-Friday-Bestellung. In WHERE sind qualifizierte Namen genauso wichtig wie in SELECT: WHERE preis > 20 würde mit dem Fehler ambiguous column name: preis enden.
Typischer Fehler: WHERE vor einem JOIN. Die Reihenfolge der Teile ist fest: Alle JOINs gehören zu FROM, und WHERE kommt nach dem letzten von ihnen. Sonst bekommst du den Fehler near "JOIN": syntax error.
So schreibst du es:
Anweisungen
- 1
Welche Spiele haben die Kunden aus Dresden gekauft? Zeige den
namedes Kunden, das Datum der Bestellung (bestellt_am) und dentiteldes Spiels, nur für die Kunden, derenstadtDresden ist. Sortiere die Zeilen nachbestellt_am, dann nachtitel:name bestellt_am titel Noah Winter 2024-04-02 Castle Siege Noah Winter 2024-04-02 Galaxy Trader Noah Winter 2024-12-23 Tiny Kingdoms Ida Zimmermann 2025-11-20 Knight's Oath Noah Winter 2025-12-22 Bakery Story Noah Winter 2025-12-22 Moon Farm - 2
Finde darunter die Bestellungen, die Kunden weniger als zwei Wochen nach ihrer Anmeldung im Shop aufgegeben haben: Zeige den
namedes Kunden, den Tag der Anmeldung (beigetreten) und das Datum der Bestellung (bestellt_am), für die Bestellungen, bei denen der Unterschied zwischen den beiden Daten weniger als 14 Tage beträgt. Benutzejulianday()aus der Lektion über Funktionen. Sortiere die Zeilen nachbestellt_am:name beigetreten bestellt_am Oskar Klein 2024-11-30 2024-12-05 Greta Hoffmann 2025-02-12 2025-02-14 Sophie Arnold 2025-08-21 2025-08-30