Behalte jede Zeile einer Tabelle mit LEFT JOIN, erkenne Fehlstellen mit IS NULL und ersetze sie mit COALESCE.
Diese Lektion in Kodokon öffnenDer 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.
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);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.
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;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.
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;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.
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;