Kodokon kodokon.com

LEFT JOIN und NULL: finden, was fehlt

Behalte jede Zeile einer Tabelle mit LEFT JOIN, erkenne Fehlstellen mit IS NULL und ersetze sie mit COALESCE.

8 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Der INNER JOIN aus der vorherigen Lektion verbirgt Kunden ohne Bestellungen. Doch die häufigste geschäftliche Frage lautet genau: Wer fehlt? Inaktive Kunden, nie verkaufte Produkte, Rechnungen ohne Zahlung… Führe dieses Skript in sqliteonline.com oder sqlite3 aus: Es fügt einen vierten Kunden ohne Bestellungen hinzu.

SQL
CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  amount REAL NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'Alice', 'Lyon'),
  (2, 'Karim', 'Paris'),
  (3, 'Mina', 'Nantes'),
  (4, 'Paulo', 'Lille');

INSERT INTO orders (id, customer_id, amount)
VALUES
  (1, 1, 49.90),
  (2, 1, 15.00),
  (3, 2, 120.50);
Mina und Paulo haben keine Bestellungen aufgegeben.

LEFT JOIN behält alle Zeilen der linken Tabelle (der vor dem Schlüsselwort genannten), auch ohne Übereinstimmung auf der rechten Seite. Fehlt die Übereinstimmung, werden die Spalten der rechten Tabelle mit NULL gefüllt.

SQL
SELECT c.name, o.id AS order_id, o.amount
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id;
Mina und Paulo erscheinen, mit order_id und amount auf NULL gesetzt.

Um zu isolieren, was fehlt, filtere nach diesen NULL-Werten: Das ist das Anti-Join-Muster, ein unverzichtbarer Reflex in der Datenanalyse. Die getestete Spalte muss aus der rechten Tabelle stammen und darf von Natur aus nie NULL sein, daher die Wahl ihres Primärschlüssels o.id.

SQL
SELECT c.name, c.city
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id
WHERE o.id IS NULL;
Die Kunden, die nie bestellt haben: Mina und Paulo.

Ein letztes Werkzeug: COALESCE(a, b) gibt a zurück, wenn es nicht NULL ist, andernfalls b. In Kombination mit einem LEFT JOIN und einer Aggregation verwandelt es Fehlstellen in brauchbare Nullen in einem Bericht oder einer Rechnung.

SQL
SELECT c.name,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers AS c
LEFT JOIN orders AS o
  ON o.customer_id = c.id
GROUP BY c.id
ORDER BY total_spent DESC;
Gesamtausgaben pro Kunde, 0 statt NULL für die Inaktiven.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Welche Kombination listet die Kunden auf, die nie bestellt haben?
    • INNER JOIN, dann WHERE o.id IS NULL
    • LEFT JOIN, dann WHERE o.id IS NULL
    • LEFT JOIN, dann WHERE o.id = NULL
  2. Was gibt die Bedingung amount = NULL zurück?
    • Wahr für die Zeilen, in denen amount NULL ist
    • Nie wahr: Der Vergleich bleibt undefiniert
    • Einen Syntaxfehler
  3. Was gibt COALESCE(SUM(o.amount), 0) für einen Kunden ohne Bestellungen zurück?
    • 0
    • NULL
    • Der Kunde wird aus dem Ergebnis ausgeschlossen
    • Einen Aggregationsfehler