Alle Zeilen behalten mit LEFT JOIN
JOIN lässt die Zeilen ohne Gegenstück weg: In einer Liste von Kunden mit ihren Bestellungen gibt es weder Hannes Schulz noch Max Krause. Oft willst du aber alle Zeilen einer Tabelle, ob sie ein Gegenstück haben oder nicht. Dafür ist LEFT JOIN da:
SELECT k.name, b.id, b.bestellt_am
FROM kunden AS k
LEFT JOIN bestellungen AS b ON b.kunde_id = k.id
ORDER BY b.bestellt_am, k.name;| name | id | bestellt_am |
|---|---|---|
| Hannes Schulz | NULL | NULL |
| Max Krause | NULL | NULL |
| Emma Becker | 1 | 2024-01-20 |
| Lukas Neumann | 2 | 2024-02-14 |
| … | … | … |
Die Tabelle vor LEFT JOIN, hier kunden, ist die linke, und die Tabelle danach ist die rechte. LEFT JOIN behält jede Zeile der linken Tabelle. Die Zeilen, die ein Gegenstück haben, werden gepaart wie bei JOIN. Eine Zeile ohne Gegenstück bleibt einmal im Ergebnis, und die Spalten der rechten Tabelle sind darin NULL: Hannes Schulz hat keine Bestellung, also sind die ID und das Datum seiner Bestellung NULL. Und weil NULL beim Sortieren zuerst kommt, stehen die Kunden ohne Bestellung ganz oben.
Jetzt kommt es also darauf an, welche Tabelle zuerst steht. FROM bestellungen AS b LEFT JOIN kunden AS k … behält jede Bestellung, und da jede Bestellung einen Kunden hat, findet es nicht mehr als JOIN. Setze die Tabelle an den Anfang, deren Zeilen du behalten willst. Du siehst vielleicht auch LEFT OUTER JOIN, das ist dasselbe.
Es gibt auch RIGHT JOIN, das jede Zeile der rechten Tabelle behält, und FULL JOIN, das die Zeilen beider behält. SQLite kennt beide, aber du wirst sie selten brauchen: Ein RIGHT JOIN ist ein LEFT JOIN mit vertauschten Tabellen, und die meisten Programmierer schreiben LEFT JOIN.
Vorsicht, wenn nach einem LEFT JOIN eine weitere Tabelle verbunden wird. Angenommen, du willst auch die Titel der Spiele in den Bestellungen jedes Kunden und fügst JOIN positionen AS p ON p.bestellung_id = b.id hinzu. Für Hannes Schulz ist b.id NULL, und NULL ist nichts gleich, seine Zeile findet also keine Position, und das einfache JOIN wirft sie wieder hinaus. Eine Tabelle, die an die rechte Tabelle eines LEFT JOIN anschließt, braucht meist auch ein LEFT JOIN.
So schreibst du es:
Anweisungen
- 1
Zeige jedes Spiel mit den Sternen seiner Bewertungen, auch die Spiele, die niemand bewertet hat: den
titelund diesterne, sortiert nachtitel, dann nachsternevom höchsten Wert. Castle Siege hat keine Bewertung, seine Sterne sind also NULL:titel sterne Bakery Story 4 Castle Siege NULL Cube Logic 5 Cube Logic 3 … … - 2
Liste darunter jeden Kunden mit den Titeln der Spiele auf, die er bewertet hat: den
nameund dentitel, aus drei Tabellen:kunden,bewertungenundspiele. Die Kunden, die nichts bewertet haben, müssen im Ergebnis bleiben. Sortiere die Zeilen nachtitel, dann nachname:name titel Hannes Schulz NULL Max Krause NULL Mia Lange Bakery Story Emma Becker Cube Logic Olivia Braun Cube Logic Anna Fischer Dragon Forge … …