Kodokon kodokon.com

LEFT JOIN et NULL : trouver ce qui manque

Conservez toutes les lignes d'une table avec LEFT JOIN, repérez les absences avec IS NULL et remplacez-les avec COALESCE.

8 min · 3 questions

Ouvrir cette leçon dans Kodokon

L'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.

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 et Paulo n'ont passé aucune commande.

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.

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 et Paulo apparaissent, avec order_id et amount à NULL.

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.

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;
Les clients qui n'ont jamais commandé : Mina et Paulo.

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.

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;
Total dépensé par client, 0 au lieu de NULL pour les inactifs.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quelle combinaison liste les clients qui n'ont jamais commandé ?
    • INNER JOIN puis WHERE o.id IS NULL
    • LEFT JOIN puis WHERE o.id IS NULL
    • LEFT JOIN puis WHERE o.id = NULL
  2. Que renvoie la condition amount = NULL ?
    • Vrai pour les lignes où amount est NULL
    • Jamais vrai : la comparaison reste indéterminée
    • Une erreur de syntaxe
  3. Que renvoie COALESCE(SUM(o.amount), 0) pour un client sans commande ?
    • 0
    • NULL
    • Le client est exclu du résultat
    • Une erreur d'agrégation