Trouver les lignes sans correspondance (jointure anti)
Le schéma LEFT JOIN / IS NULL pour trouver les éléments orphelins et les données manquantes
Trouver les lignes sans correspondance (jointure anti) est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 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 question de l'anti-jointure
Voici l'une des questions d'entretien les plus fréquentes sur les jointures externes : « Trouvez les clients qui n'ont jamais passé de commande. » Ou encore : « Listez les produits qui n'ont jamais été vendus » ou « les commandes sans client correspondant ».
Tous ces cas ont la même structure : des lignes d'une table qui n'ont aucune correspondance dans une autre. La formulation idiomatique claire est l'anti-jointure, construite à partir d'une LEFT JOIN et d'un filtre IS NULL.
L'idée fondamentale
Commencez par une LEFT JOIN : elle conserve chaque ligne de gauche et les lignes de gauche sans correspondance reçoivent NULL dans les colonnes de la table de droite.
Les lignes sans correspondance sont donc exactement celles où une colonne de la table de droite vaut NULL. Filtrez cette condition pour isoler les lignes sans correspondance. C'est toute l'astuce.
Construire le modèle
Voici l'anti-jointure canonique pour trouver les clients sans commande. Lisez-la en deux temps : LEFT JOIN conserve tous les clients, puis WHERE o.customer_id IS NULL conserve uniquement ceux sans correspondance.
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
WHERE o.customer_id IS NULL;
-- only customers with zero ordersPourquoi cela fonctionne, étape par étape
Suivez le déroulement avec nos données, où Carol n'a aucune commande :
- LEFT JOIN produit Alice (x2), Bob (x1) et Carol avec des NULL dans les colonnes de droite.
WHERE o.customer_id IS NULLélimine Alice et Bob (leurs colonnes de droite contiennent de vraies valeurs).- Seule la ligne de Carol, celle dont les NULL ont été ajoutés par la jointure, subsiste.
Le filtre s'exécute après la jointure : il voit donc ces NULL et sélectionne précisément les lignes orphelines.
Choisir la bonne colonne à vérifier
Vérifiez une colonne de la table de droite qui ne peut jamais légitimement être NULL dans une correspondance réelle, idéalement la clé de jointure ou la clé primaire.
Si vous vérifiez une colonne de droite pouvant être NULL, comme o.shipped_at, vous détecteriez aussi les commandes qui existent mais n'ont pas été expédiées : ce serait une mauvaise réponse. Vérifier o.customer_id (la clé de jointure) ou o.id (sa clé primaire) garantit que NULL signifie « aucune ligne correspondante ».
-- SAFE: join key / primary key
WHERE o.id IS NULL
-- RISKY: a nullable data column
WHERE o.shipped_at IS NULL -- catches unshipped too!Anti-jointure et NOT IN
Les recruteurs comparent l'anti-jointure à NOT IN. Elles semblent équivalentes, mais leur comportement avec NULL diffère.
Si la sous-requête renvoie le moindre NULL, NOT IN ne renvoie aucune ligne, ce qui constitue un bug silencieux bien connu. L'anti-jointure LEFT JOIN / IS NULL y est insensible.
-- DANGEROUS if any customer_id is NULL
SELECT id, name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- SAFE anti-join, same intent
SELECT c.id, c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Anti-jointure et NOT EXISTS
L'autre équivalent est NOT EXISTS avec une sous-requête corrélée. Cette solution gère également les NULL correctement et est souvent tout aussi rapide.
Les trois solutions (LEFT JOIN/IS NULL, NOT EXISTS, NOT IN) permettent d'exprimer des anti-jointures, mais en entretien, préférez LEFT JOIN/IS NULL ou NOT EXISTS pour leur sécurité vis-à-vis de NULL. Signaler le piège de NOT IN vous fera gagner des points.
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Une erreur fréquente
Une erreur fréquente consiste à placer la condition d'absence de correspondance dans la clause ON au lieu de WHERE.
Écrire ... ON o.customer_id = c.id AND o.id IS NULL ne filtre pas le résultat ; cela modifie simplement ce qui compte comme une correspondance, et chaque client est quand même conservé par LEFT JOIN. La vérification IS NULL doit figurer dans WHERE, après la jointure. Nous étudierons complètement ce piège dans la leçon suivante.
Trouver les lignes enfants orphelines
Le modèle fonctionne également dans l'autre sens. Pour trouver les commandes qui font référence à un client inexistant (des lignes orphelines, dans le cadre d'une vérification de l'intégrité des données), préservez orders et vérifiez que le côté client vaut NULL.
SELECT o.id AS order_id, o.customer_id
FROM orders o
LEFT JOIN customers c
ON c.id = o.customer_id
WHERE c.id IS NULL;
-- orders pointing to a non-existent customerCompter les lignes orphelines
La demande consiste souvent simplement à obtenir un nombre : « Combien de clients n'ont jamais commandé ? » Encapsulez l'anti-jointure ou comptez directement.
Comme l'anti-jointure renvoie déjà une ligne par ligne orpheline, un simple COUNT(*) appliqué à son résultat est correct ici : il y a exactement une ligne par client sans correspondance.
SELECT COUNT(*) AS never_ordered
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Le modèle réutilisable
Mémorisez cette structure en trois lignes ; elle résout une grande famille de questions d'entretien :
FROM keep_table kLEFT JOIN other o ON o.fk = k.idWHERE o.id IS NULL
Remplacez les tables et les clés pour trouver les produits invendus, les tickets non attribués, les utilisateurs sans connexion, bref tout ce qui est décrit comme « X sans Y correspondant ».
Vérification rapide
Vous devez trouver les produits qui n'ont jamais figuré dans les éléments de commande.
Récapitulatif
L'anti-jointure trouve les lignes sans correspondance : LEFT JOIN, puis WHERE right_key IS NULL.
- Vérifiez la clé de jointure ou la clé primaire, jamais une colonne de données pouvant être NULL.
- La vérification
IS NULLse place dansWHERE, et non dansON. - Elle est équivalente à
NOT EXISTS; préférez-la àNOT IN, qui ne fonctionne plus correctement avec les NULL. - Inversez les tables pour trouver les lignes enfants orphelines.
Un seul modèle pour de nombreuses questions : « X sans Y correspondant ».
Questions Fréquemment Posées
La leçon « Trouver les lignes sans correspondance (jointure anti) » est-elle gratuite ?
Oui — le texte complet de « Trouver les lignes sans correspondance (jointure anti) » 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 « Trouver les lignes sans correspondance (jointure anti) » ?
Le schéma LEFT JOIN / IS NULL pour trouver les éléments orphelins et les données manquantes 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 3 sur 4.
Combien de temps prend la leçon « Trouver les lignes sans correspondance (jointure anti) » ?
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