0Pricing
Coding Interview Prep · Leçon

Le piège de WHERE sur une jointure externe

Pourquoi filtrer dans WHERE une colonne issue d’une jointure externe la transforme silencieusement en jointure interne

Le piège de WHERE sur une jointure externe est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 4 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.

Le piège qui surprend tout le monde

Voici le piège de jointure externe le plus courant que les recruteurs vous tendent : « Affichez chaque client et ses commandes de 2024, y compris les clients sans commande en 2024. »

Un candidat écrit une LEFT JOIN, puis ajoute un filtre de date dans WHERE, et les clients sans commande en 2024 disparaissent discrètement. La LEFT JOIN se transforme silencieusement en INNER JOIN. Comprendre pourquoi est un signe d'expérience avancée.

La requête incorrecte

Voici l'erreur. Elle semble raisonnable : conserver tous les clients, joindre leurs commandes et filtrer sur 2024.

Mais les clients sans commande, ou sans commande en 2024, disparaissent du résultat. L'exigence de les inclure n'est pas respectée.

-- BUG: drops customers with no 2024 order
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';

Pourquoi cela échoue

Rappelez-vous l'ordre des opérations : la JOIN s'exécute d'abord et produit des lignes où les clients sans correspondance ont NULL dans chaque colonne de commande. Ensuite, WHERE s'exécute.

Pour un client sans correspondance, o.order_date vaut NULL ; ainsi, o.order_date >= '2024-01-01' s'évalue à UNKNOWN, et non à vrai. WHERE ne conserve que les lignes dont l'évaluation est vraie : les lignes contenant NULL sont donc filtrées, précisément celles que la LEFT JOIN cherchait à préserver.

NULL neutralise le filtre

Toute comparaison avec NULL donne UNKNOWN : NULL >= '2024-01-01' donne UNKNOWN, NULL = 5 donne UNKNOWN, et même NULL <> 5 donne UNKNOWN.

Puisque WHERE ne conserve que les lignes qui s'évaluent à TRUE, chaque ligne préservée sans correspondance est éliminée. Toute la raison d'être de la jointure externe est annulée par un seul prédicat WHERE portant sur une colonne de la table de droite.

La correction : filtrer dans ON

Déplacez le filtre dans la clause ON. Il fait alors partie de la condition de correspondance et s'applique avant la préservation des lignes ; les clients sans correspondance subsistent donc avec des NULL.

-- CORRECT: filter lives in ON
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.order_date >= '2024-01-01';
-- customers with no 2024 order: kept, NULL order

ON et WHERE en une phrase

Voici la règle à réciter en entretien :

Pour la table préservée (externe), les conditions portant sur l'autre table se placent dans ON ; celles qui portent sur la table préservée elle-même se placent dans WHERE.

  • ON détermine ce qui compte comme une correspondance (pendant la jointure).
  • WHERE filtre les lignes finales (ensuite, et élimine les lignes contenant NULL).

Résultats côte à côte

Mêmes données, deux emplacements, deux réponses différentes. Supposons que Carol n'ait aucune commande de 2024.

  • Filtre dans WHERE : Carol disparaît. Il s'agit en pratique d'une jointure interne.
  • Filtre dans ON : Carol apparaît une fois avec des NULL dans les colonnes de commande ; l'exigence est respectée.

La différence de résultat est précisément tout l'enjeu de ce piège.

-- ON version output
-- Alice | 50 | 2024-03-01
-- Bob   | 20 | 2024-05-02
-- Carol | NULL | NULL   <-- preserved

Quand WHERE est effectivement correct

Un WHERE dans une jointure externe n'est pas toujours une erreur. Filtrer la table préservée est correct : cela ne fait pas intervenir les NULL issus de la jointure.

De même, l'anti-jointure de la leçon précédente utilise intentionnellement WHERE o.id IS NULL pour tirer parti de ce comportement. L'essentiel est de savoir dans quel cas vous vous trouvez.

-- Fine: filtering the preserved (left) table
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'US';

L'heuristique de détection

Lors de l'examen d'une jointure externe, recherchez dans la clause WHERE les prédicats portant sur la table non préservée (à l'exception des vérifications d'anti-jointure IS NULL).

Si vous voyez o.someColumn = ... ou une vérification de plage ou d'égalité sur le côté externe dans WHERE, méfiez-vous de ce piège. Demandez-vous : « Est-ce que cela transforme ma LEFT JOIN en INNER JOIN ? » C'est généralement le cas.

Plusieurs conditions

Vous pouvez combiner les deux emplacements. Les conditions de correspondance portant sur la table de droite vont dans ON ; un véritable filtre postérieur à la jointure portant sur la table de gauche va dans WHERE. Ils coexistent sans difficulté.

SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.amount > 100          -- match condition
WHERE c.signup_year = 2023;    -- preserved-table filter

L'expliquer à voix haute

En entretien, décrivez le mécanisme, pas seulement la correction :

« La jointure s'exécute d'abord et complète les colonnes de droite sans correspondance avec NULL. Un prédicat WHERE portant sur ces colonnes s'évalue à UNKNOWN pour les lignes contenant NULL, et WHERE élimine les lignes qui ne sont pas vraies ; la jointure externe s'effondre donc en jointure interne. Placer le prédicat dans ON le maintient comme condition de correspondance et préserve les lignes sans correspondance. » Cette explication fonctionne à chaque fois.

Vérification rapide

Vous devez lister tous les clients et uniquement leurs commandes de 2024, en conservant ceux qui n'en ont aucune.

Récapitulatif

Filtrer la colonne d'une table non préservée dans WHERE transforme silencieusement une jointure externe en jointure interne, car les NULL des lignes sans correspondance ne satisfont pas le prédicat (UNKNOWN) et WHERE les élimine.

  • Les conditions de correspondance portant sur la table externe vont dans ON.
  • Les filtres portant sur la table préservée vont dans WHERE.
  • IS NULL dans WHERE correspond à l'anti-jointure intentionnelle, et non au piège.
  • Expliquez l'ordre des opérations pour montrer que vous avez compris.

Questions Fréquemment Posées

La leçon « Le piège de WHERE sur une jointure externe » est-elle gratuite ?

Oui — le texte complet de « Le piège de WHERE sur une jointure externe » 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 « Le piège de WHERE sur une jointure externe » ?

Pourquoi filtrer dans WHERE une colonne issue d’une jointure externe la transforme silencieusement en jointure interne 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 4 sur 4.

Combien de temps prend la leçon « Le piège de WHERE sur une jointure externe » ?

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

  1. LEFT JOIN et conservation des lignes sans correspondance
  2. Sémantique de RIGHT et FULL OUTER JOIN
  3. Trouver les lignes sans correspondance (jointure anti)
  4. Le piège de WHERE sur une jointure externe
← Retour à Coding Interview Prep