LEFT JOIN et conservation des lignes sans correspondance
Comprendre ce que LEFT JOIN conserve et comment les NULL apparaissent pour les lignes sans correspondance
LEFT JOIN et conservation des lignes sans correspondance est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.
La situation d’entretien
Un intervieweur vous dit : "Listez chaque client et ses commandes, y compris les clients qui n’ont jamais commandé." Un INNER JOIN élimine les clients sans commande et ne satisfait donc pas cette exigence. Il faut utiliser un LEFT JOIN.
Un LEFT JOIN conserve chaque ligne de la table de gauche (nommée en premier) et lui associe les lignes correspondantes de la table de droite lorsqu’elles existent. Cette leçon construit le modèle mental précis attendu par les intervieweurs.
Ce que garantit LEFT JOIN
La promesse fondamentale est la suivante : chaque ligne de la table de gauche apparaît au moins une fois dans le résultat, qu’elle ait une correspondance ou non.
- Si une ligne de gauche trouve des correspondances à droite, vous obtenez une ligne de résultat par correspondance.
- Si une ligne de gauche ne trouve aucune correspondance, vous obtenez tout de même une ligne de résultat, avec toutes les colonnes de la table de droite définies à
NULL.
C’est pourquoi les intervieweurs parlent de jointure externe : les lignes qui ne font pas partie de l’ensemble des correspondances sont conservées au lieu d’être supprimées.
Les deux tables
Dans toute cette leçon, nous utilisons deux tables simples. customers contient tous les clients ; orders enregistre les achats et fait référence à un client par l’intermédiaire de customer_id.
Remarquez que le client 3 (Carol) n’a aucune ligne dans orders. C’est précisément ce client sans correspondance qu’un LEFT JOIN doit conserver.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20Écrire le LEFT JOIN
La syntaxe reprend celle d’une jointure interne, en remplaçant INNER par LEFT (le mot OUTER est facultatif : LEFT JOIN et LEFT OUTER JOIN sont identiques).
La table écrite avant le mot-clé est le côté gauche conservé. L’ordre compte : customers LEFT JOIN orders conserve tous les clients, et non toutes les commandes.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;Lire le résultat
Voici le résultat de cette requête. Alice a deux correspondances, elle apparaît donc deux fois. Bob en a une. Carol n’a aucune correspondance ; elle apparaît tout de même avec NULL dans la colonne amount.
Cette unique ligne de Carol contenant NULL est la marque distinctive d’un LEFT JOIN. Un intervieweur qui vous écoute raisonner à voix haute veut vous entendre dire : "les lignes de gauche sans correspondance subsistent avec des NULL à droite".
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchD’où viennent les NULL
Le NULL n’est stocké nulle part. La base de données le génère, car aucune ligne de la table de droite ne peut fournir amount.
Toute colonne provenant de la table de droite devient NULL pour une ligne de gauche sans correspondance : o.id, o.customer_id et o.amount valent tous NULL dans la ligne de Carol. C’est important, car la valeur NULL de o.customer_id ne signifie pas que le client n’a pas d’identifiant ; elle signifie qu’il n’y avait aucune commande correspondante.
Compter les commandes par client
Une question fréquente ensuite : "Combien de commandes chaque client a-t-il, zéros compris ?" Un LEFT JOIN associé à COUNT donne la bonne réponse, mais vous devez compter la colonne de la table de droite, et non *.
COUNT(o.id) ignore les NULL, donc Carol obtient 0. COUNT(*) renverrait à tort 1 pour Carol, car la ligne synthétisée contenant des NULL compte tout de même comme une ligne.
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob | 1
-- Carol | 0Le piège de COUNT(*) et COUNT(column)
C’est un piège classique en entretien. Après un LEFT JOIN, la ligne de gauche sans correspondance existe concrètement dans le résultat, avec des colonnes de droite à NULL.
COUNT(*)compte cette ligne et renvoie 1 pour un client sans commande.COUNT(o.id)ignore le NULL et renvoie correctement 0.
Lorsque vous avez besoin de vrais zéros, comptez toujours une colonne qui vaut NULL du côté sans correspondance.
-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;Faire des sommes avec LEFT JOIN
Les agrégats autres que COUNT se comportent correctement avec les NULL synthétisés. SUM ignore les NULL ; un client sans correspondance produit donc NULL (et non une erreur).
Pour les rapports, les intervieweurs attendent souvent un zéro plutôt que NULL. Entourez l’agrégat de COALESCE pour remplacer cette valeur par défaut.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob | 20
-- Carol | 0Table de gauche ou table de droite : une réponse claire
Lorsqu’un intervieweur demande "quelle table est conservée ?", répondez avec assurance : celle qui se trouve à gauche du mot-clé JOIN. Lisez la requête de gauche à droite.
A LEFT JOIN B signifie : conserver toutes les lignes de A. Pour conserver toutes les lignes de B, inversez les tables avec B LEFT JOIN A ou utilisez un RIGHT JOIN. La plupart des équipes préfèrent utiliser exclusivement LEFT JOIN pour faciliter la lecture, en réordonnant simplement les tables.
Une liste mentale de vérification
Lorsque vous voyez un LEFT JOIN en entretien, énoncez cette liste à voix haute :
- Côté conservé ? La table de gauche, dont toutes les lignes sont conservées.
- Lignes sans correspondance ? Elles apparaissent une fois, avec des NULL provenant de la droite.
- Vous comptez ? Utilisez
COUNT(right_col)pour obtenir de vrais zéros. - Vous faites une somme ? Entourez-la de
COALESCEsi vous avez besoin de 0 plutôt que de NULL.
Énoncer cette liste montre une rigueur de niveau confirmé.
Vérification rapide
Testez votre intuition sur le comptage avec LEFT JOIN.
Récapitulatif
LEFT JOIN conserve chaque ligne de la table de gauche. Les lignes de gauche correspondantes sont associées à leurs correspondances de droite ; les lignes de gauche sans correspondance subsistent une fois, avec NULL dans toutes les colonnes de la table de droite.
- La table de gauche est celle qui précède le mot-clé
JOIN. - Les NULL synthétisés signalent les lignes sans correspondance.
COUNT(right_col)donne de vrais zéros ;COUNT(*)ne le fait pas.COALESCE(SUM(...), 0)transforme les totaux NULL en zéro.
C’est la base pour trouver les données manquantes et les anti-jointures dans les prochaines leçons.
Questions Fréquemment Posées
La leçon « LEFT JOIN et conservation des lignes sans correspondance » est-elle gratuite ?
Oui — le texte complet de « LEFT JOIN et conservation des lignes sans correspondance » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « LEFT JOIN et conservation des lignes sans correspondance » ?
Comprendre ce que LEFT JOIN conserve et comment les NULL apparaissent pour les lignes sans correspondance Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?
Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « LEFT JOIN et conservation des lignes sans correspondance » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?
Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- LEFT JOIN et conservation des lignes sans correspondance
- Sémantique de RIGHT et FULL OUTER JOIN
- Trouver les lignes sans correspondance (jointure anti)
- Le piège de WHERE sur une jointure externe