Conservez toutes les lignes d'une table avec LEFT JOIN, repérez les absences avec IS NULL et remplacez-les avec COALESCE.
Ouvrir cette leçon dans KodokonL'INNER JOIN de la leçon précédente cache les clients sans commande. Or la question métier la plus fréquente est justement : qui manque à l'appel ? Clients inactifs, produits jamais vendus, factures sans paiement... Rejouez ce script dans sqliteonline.com ou sqlite3 : il ajoute un quatrième client sans commande.
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 conserve toutes les lignes de la table de gauche (celle citée avant le mot-clé), même sans correspondance à droite. Quand la correspondance manque, les colonnes de la table de droite sont remplies avec NULL.
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;Pour isoler ce qui manque, filtrez sur ces NULL : c'est le motif de l'anti-jointure, un réflexe indispensable en analyse de données. La colonne testée doit venir de la table de droite et ne jamais être NULL naturellement, d'où le choix de sa clé primaire 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;Dernier outil : COALESCE(a, b) renvoie a si elle n'est pas NULL, sinon b. Combinée à un LEFT JOIN et une agrégation, elle transforme les absences en zéros exploitables dans un rapport ou une facture.
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;