Zum Inhalt
wannacode

LEFT JOIN: auch Zeilen ohne Partner

Kurz gesagt: LEFT JOIN behält jede Zeile der linken Tabelle, auch die ohne Partner in der rechten Tabelle, und füllt die fehlenden Spalten mit NULL.

Problem

Wer hat noch nicht bestellt?

Das Marketing will den Kunden schreiben, die sich angemeldet, aber noch nichts bestellt haben. In der letzten Lektion lieferte JOIN 60 Zeilen, und Teodora und Yavor waren nicht darunter.

JOIN behält nur die Paare. Eine Zeile ohne Partner verschwindet ohne Warnung. Hier sind das genau die Zeilen, die wir brauchen.

Die Idee

LEFT JOIN

Vergleiche die beiden Abfragen. Die erste benutzt JOIN:

SQLDatenbank: Shop

Die zweite benutzt LEFT JOIN:

SQLDatenbank: Shop

62 Zeilen statt 60. LEFT JOIN behält jede Zeile der linken Tabelle (der in FROM), auch wenn es in der rechten keinen Partner gibt. Wo es keinen Partner gibt, sind die Spalten der rechten Tabelle NULL. Scrolle ans Ende: Teodora und Yavor sind da, mit NULL für Nummer und Datum.

Von hier sind die Kunden ohne Bestellungen nur einen Schritt entfernt:

SQLDatenbank: Shop

WHERE o.id IS NULL behält nur die Zeilen, in denen keine Bestellung gefunden wurde. Wir prüfen o.id, weil der Primärschlüssel einer gefundenen Bestellung nie leer ist.

Sieh es dir an

Auch eine leere Antwort ist eine Antwort

Gibt es Produkte, die noch nie jemand bestellt hat? Dasselbe Vorgehen, mit order_items:

SQLDatenbank: Shop

Keine einzige Zeile. Jedes der 25 Produkte wurde mindestens einmal bestellt. Eine Tabelle ohne Zeilen ist kein Fehler: Die Abfrage hat geantwortet „es gibt keine“.

Probier es aus

Die leeren Kategorien

Welche Kategorien haben kein Produkt direkt in sich? Zeige den Namen der Kategorie.

SQLDatenbank: Shop

Sieh es dir an

Zählen mit den Nullen

Wie viele Bestellungen hat jeder Kunde, auch die ohne? Ein erster Versuch mit COUNT(*):

SQLDatenbank: Shop

Teodora und Yavor haben je 1 Bestellung? Nein. COUNT(*) zählt Zeilen, und LEFT JOIN hat jedem von ihnen eine Zeile voller NULL gegeben. Zähle, was einen Wert hat, COUNT(o.id):

SQLDatenbank: Shop

COUNT(Spalte) überspringt die NULL, also kommen sie mit 0 heraus. Zähle bei LEFT JOIN eine Spalte der rechten Tabelle, am besten ihren Primärschlüssel.

Probier es aus

Bewertungen pro Produkt

Zeige jedes Produkt und wie viele Bewertungen es hat, auch die Produkte ohne Bewertung (mit 0).

SQLDatenbank: Shop

Sieh es dir an

Die WHERE-Falle

Ein Bericht für den Oktober: alle Kunden und wie viele Bestellungen sie seit dem 1. Oktober 2026 aufgegeben haben. Die Datumsbedingung kommt in WHERE:

SQLDatenbank: Shop
1. Warum hat WHERE o.ordered_at >= … die Kunden ohne Bestellungen im Oktober entfernt?

Fünf Zeilen, aber es gibt 20 Kunden. Eine Bedingung auf die rechte Tabelle in WHERE macht aus einem LEFT JOIN einen einfachen JOIN. Ihr Platz ist in ON: Dort sagt sie, welche Bestellungen verbunden werden, und alle Kunden bleiben.

SQLDatenbank: Shop

20 Kunden, die meisten mit 0. Die Regel: Bei LEFT JOIN kommt eine Bedingung auf die rechte Tabelle in ON. Die Ausnahme ist IS NULL, wenn du die Fehlenden suchst.

Übung

Zwei Aufgaben

1. Der Shop will die Kunden, die noch keine Bewertung geschrieben haben, einladen, eine zu schreiben. Wer sind sie? Zeige den Namen.

Die Kunden ohne eine einzige Bewertung:

SQLDatenbank: Shop

2. Die Kampagne „Wir vermissen dich“ gilt den Kunden, die seit dem 1. Juli 2026 keine Bestellung aufgegeben haben (auch denen, die nie bestellt haben). Zeige Name und E-Mail.

Die Kunden ohne Bestellung seit dem 2026-07-01:

SQLDatenbank: Shop
Genauer, für Neugierige

Es gibt auch RIGHT JOIN (behält die Zeilen der rechten Tabelle) und FULL JOIN (behält beide Seiten). SQLite versteht sie seit Version 3.39. RIGHT JOIN schreibt man selten: Es ist dasselbe wie LEFT JOIN mit vertauschten Tabellen. MySQL hat kein FULL JOIN.

SQLDatenbank: Shop

Hier kommen nur die Kunden ohne Bestellungen heraus, denn jede Bestellung hat einen Kunden.

Test

Teste dich

1. FROM customers c LEFT JOIN orders o … Welche Kunden kommen heraus?
2. Wie findest du die Kunden ohne Bestellungen?
3. Ein Kunde ohne Bestellungen, LEFT JOIN und GROUP BY. Was ergibt COUNT(*) für ihn?
4. Du willst alle Kunden und nur ihre Bestellungen aus dem Oktober. Wohin gehört die Datumsbedingung?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·