Finden, was fehlt
LEFT JOIN kennzeichnet die Zeilen ohne Gegenstück mit NULL, und NULL lässt sich leicht mit IS NULL finden. Zusammen beantworten sie Fragen danach, was fehlt. Welche Kunden haben noch nie etwas bestellt?
SELECT k.name, k.email
FROM kunden AS k
LEFT JOIN bestellungen AS b ON b.kunde_id = k.id
WHERE b.id IS NULL
ORDER BY k.name;| name | |
|---|---|
| Hannes Schulz | hannes@schulz.dev |
| Max Krause | max.krause@mail.de |
Schritt für Schritt: Das LEFT JOIN gibt jeden Kunden mit jeder seiner Bestellungen und jeden Kunden ohne Bestellung einmal, mit NULL. Das ist das Ergebnis der vorigen Übung. WHERE behält dann nur die Zeilen, in denen b.id NULL ist, und das sind genau die Kunden, für die keine Bestellung gefunden wurde.
Welche Spalte der rechten Tabelle solltest du prüfen? Eine, die in einer Zeile mit Gegenstück nie NULL ist: ihr Primärschlüssel oder eine Spalte mit NOT NULL. positionen und bewertungen haben keine id, prüfe also zum Beispiel p.bestellung_id oder bw.sterne. Nimm keine Spalte, die ohnehin NULL sein kann, wie den kommentar einer Bewertung: Du bekämst auch die Spiele, die eine Bewertung haben, nur eben eine ohne Kommentar.
Typischer Fehler: WHERE b.id = NULL. Wie du aus Lektion 3 weißt, ist = NULL nie wahr, die Abfrage findet also nichts. Sie findet auch nichts, wenn du JOIN statt LEFT JOIN schreibst: Ein JOIN hat keine Zeilen mit NULL, weil es die Zeilen ohne Gegenstück verwirft, bevor WHERE sie überhaupt sieht.
Die umgekehrte Frage, welche Kunden etwas bestellt haben, braucht nur JOIN. Jeder Kunde stünde so oft im Ergebnis, wie er Bestellungen hat, also füge DISTINCT hinzu: SELECT DISTINCT k.name FROM kunden AS k JOIN bestellungen AS b ON ….
So schreibst du es:
Anweisungen
- 1
Welche Spiele hat noch niemand bestellt? Beginne mit einer Abfrage, die
spiele(Aliass) so mitpositionen(Aliasp) verbindet, dass jedes Spiel im Ergebnis bleibt, und dentitelund denpreisdes Spiels zeigt. - 2
Füge jetzt eine Bedingung hinzu, die nur die Spiele behält, die in keiner Bestellung vorkommen, und sortiere sie nach
titel:titel preis Lost Temple 20 Mystery Manor 25 Robot Rebellion 40 - 3
Schreibe darunter eine Abfrage, die die Spiele ohne Bewertung findet: ihren
titelund das Datum, an dem sie erschienen sind (erschienen), sortiert nachtitel. Zwei davon sind noch nicht erschienen, sie haben also NULL inerschienen. Das ist ein NULL des Spiels selbst, kein Zeichen für eine fehlende Bewertung:titel erschienen Castle Siege 2021-05-20 Lost Temple 2022-04-07 Mystery Manor NULL Robot Rebellion NULL