0Pricing
SQL Interview Prep · Leçon

ON ou WHERE dans les jointures

Savoir quand placer un prédicat dans ON plutôt que dans WHERE et comprendre son effet sur les résultats

ON ou WHERE dans les jointures est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 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 SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

Un prédicat peut se trouver à deux endroits

Une fois que vous savez écrire un INNER JOIN, la question suivante posée en entretien est plus précise : cette condition doit-elle se trouver dans ON ou dans WHERE ?

Pour un INNER JOIN, la réponse est souvent « cela ne change rien au résultat ». Mais dès que vous passez à une jointure externe, le choix modifie complètement la réponse. Les recruteurs posent précisément cette question parce que les débutants mettent tout dans WHERE par habitude.

Cette leçon présente la règle clairement.

Rôle de ON

La clause ON définit la manière dont les lignes sont appariées. Elle est évaluée pendant la construction de la jointure et détermine quelle ligne de la table de gauche correspond à quelle ligne de la table de droite.

Considérez ON comme la réponse à la question : « pour ces deux lignes, doivent-elles être associées ? »

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

Rôle de WHERE

La clause WHERE est évaluée après que la jointure a produit ses lignes combinées. Elle filtre cet ensemble de résultats et élimine les lignes qui échouent au test.

Considérez WHERE comme la réponse à la question : « maintenant que j'ai associé les lignes, lesquelles veux-je conserver ? »

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

Avec INNER JOIN, elles donnent souvent le même résultat

Pour un INNER JOIN, un filtre supplémentaire donne le même résultat, qu'il soit placé dans ON ou dans WHERE. Les deux requêtes ci-dessous renvoient uniquement la commande de 50 $ d'Ada et celle de 99 $ de Bob.

Comme les lignes sans correspondance sont déjà supprimées par une jointure interne, déplacer le prédicat ne modifie pas les lignes qui subsistent.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

Pourquoi les conventions préfèrent ON pour les clés de jointure

Même lorsque les résultats sont identiques, la convention veut que vous placiez les conditions de relation entre les tables dans ON et les filtres métier dans WHERE.

  • ON : o.customer_id = c.id (la manière dont les tables sont liées)
  • WHERE : o.amount > 30 (les résultats que vous voulez obtenir)

Cette séparation rend l'intention évidente pour la personne qui lira le code ensuite, ainsi que pour le recruteur qui évalue votre style.

Le cas où cela compte vraiment : les jointures externes

La distinction devient décisive avec un LEFT JOIN, qui conserve chaque ligne de gauche même lorsqu'aucune ligne de droite ne correspond. Voici un aperçu rapide avec des clients et des commandes, sachant que Cleo n'a aucune commande.

Un LEFT JOIN conserve Cleo avec des colonnes de commande à NULL. Observez maintenant l'effet de ON et de WHERE sur sa ligne.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

Filtre dans ON : les lignes sont conservées

Placez la condition amount > 30 dans ON d'un LEFT JOIN : elle ne modifie que les lignes de droite qui sont associées. Les lignes de gauche sans correspondance sont tout de même conservées, avec des NULL.

Cleo est conservée. Toute commande qui échoue au test n'est tout simplement pas associée, ce qui laisse un NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

Filtre dans WHERE : la jointure externe disparaît

Déplacez la même condition dans WHERE et vous filtrez le résultat de la jointure. La ligne de Cleo contient amount = NULL, et NULL > 30 n'est pas vrai : elle est donc supprimée.

La jointure LEFT JOIN se comporte alors silencieusement comme un INNER JOIN. C'est le piège des jointures le plus connu des entretiens.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

La règle à mémoriser

Énoncez-la clairement pendant un entretien :

  • Une condition dans ON détermine si la ligne de droite s'associe ; les lignes de gauche sont conservées.
  • Une condition dans WHERE filtre les lignes finales et peut éliminer les lignes de gauche conservées lorsqu'elle concerne une colonne susceptible de contenir NULL.

Pour les jointures externes, placez donc les prédicats portant sur la table facultative dans ON, sauf si vous voulez intentionnellement supprimer les lignes sans correspondance.

L'utilisation légitime de WHERE sur NULL

Dans un cas précis, filtrer dans WHERE une colonne issue d'une jointure externe est exactement la bonne approche : l'anti-jointure. Tester IS NULL permet de trouver les lignes de gauche qui n'ont eu aucune correspondance.

Ici, WHERE conserve volontairement uniquement les lignes sans correspondance et renvoie les clients n'ayant aucune commande. Le mécanisme est le même, mais l'intention est opposée.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

Test mental rapide

Avant le quiz, appliquez cette liste de contrôle lorsque vous voyez une condition de jointure :

  • S'agit-il d'une clé de jointure qui relie les tables ? -> ON.
  • S'agit-il d'un filtre sur la table obligatoire ? -> WHERE ou ON conviennent tous les deux.
  • S'agit-il d'un filtre sur la table facultative (externe) et voulez-vous conserver les lignes sans correspondance ? -> ON.
  • Voulez-vous trouver les lignes sans correspondance ? -> WHERE ... IS NULL.

Vérification rapide

Appliquez la règle ON ou WHERE à une jointure externe.

Récapitulatif : ON ou WHERE

Les points essentiels à retenir pour l'entretien :

  • ON contrôle l'appariement et, pour les jointures externes, détermine si la ligne facultative s'associe tout en conservant le côté préservé.
  • WHERE filtre le résultat déjà joint et peut supprimer des lignes préservées.
  • Avec un INNER JOIN, les deux clauses sont souvent interchangeables ; avec les jointures externes, elles ne le sont pas.
  • Les filtres sur la table externe doivent se trouver dans ON, sauf si vous voulez effectuer une anti-jointure avec IS NULL dans WHERE.

Questions Fréquemment Posées

La leçon « ON ou WHERE dans les jointures » est-elle gratuite ?

Oui — le texte complet de « ON ou WHERE dans les jointures » 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 SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « ON ou WHERE dans les jointures » ?

Savoir quand placer un prédicat dans ON plutôt que dans WHERE et comprendre son effet sur les résultats Tu pratiques SQL 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 SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL 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 2 sur 4.

Combien de temps prend la leçon « ON ou WHERE dans les jointures » ?

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 SQL Interview Prep ?

Oui. Chaque leçon SQL 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. Comment INNER JOIN met les lignes en correspondance
  2. ON ou WHERE dans les jointures
  3. Multiplication des lignes lors d’une jointure
  4. Joindre trois tables ou plus
← Retour à SQL Interview Prep