Logique à trois valeurs et UNKNOWN
Pourquoi NULL = NULL n’est pas vrai et comment UNKNOWN se propage dans les conditions
Logique à trois valeurs et UNKNOWN est une leçon SQL 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 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.
Pourquoi NULL déroute les candidats
NULL est la principale cause de réponses incorrectes lors des entretiens SQL. Le piège consiste à le traiter comme une valeur normale, alors qu’en réalité NULL signifie « inconnu » ou « manquant », et non zéro ni une chaîne vide.
Les recruteurs apprécient ce piège, car la syntaxe semble correcte, mais le résultat est incorrect sans avertissement. Ils peuvent vous montrer un filtre qui « devrait » renvoyer une ligne et vous demander pourquoi il ne renvoie rien.
Dans cette leçon, vous allez construire le modèle mental qui permet de répondre à toutes les questions sur NULL : la logique à trois valeurs. Une fois que vous aurez compris que les comparaisons peuvent renvoyer TRUE, FALSE ou UNKNOWN, tout le reste en découlera.
NULL n’est pas une valeur
La phrase la plus importante à prononcer lors d’un entretien est la suivante : NULL est l’absence d’une valeur, et non une valeur en soi.
Vous ne pouvez donc pas le comparer avec = comme vous comparez des nombres. La base de données ne sait pas si deux valeurs inconnues sont égales ; elle refuse donc de conclure à TRUE ou FALSE.
NULL = 5n’est pas FALSE, mais UNKNOWNNULL = NULLn’est pas TRUE, mais UNKNOWNNULL <> NULLdonne également UNKNOWN
C’est pourquoi un filtre d’égalité naïf appliqué à une colonne pouvant contenir NULL élimine discrètement des lignes.
Logique à deux valeurs contre logique à trois valeurs
La plupart des langages de programmation utilisent une logique à deux valeurs : une expression vaut soit TRUE, soit FALSE. SQL ajoute un troisième résultat, UNKNOWN, lorsqu’une comparaison fait intervenir NULL.
Ainsi, tout prédicat en SQL peut être évalué comme l’un de trois résultats : TRUE, FALSE ou UNKNOWN. La clause WHERE ne conserve une ligne que lorsque son prédicat vaut exactement TRUE. UNKNOWN se comporte comme FALSE pour le filtrage, mais ces deux résultats ne sont pas logiquement identiques.
Les recruteurs vérifient que vous connaissez cette distinction, car UNKNOWN se comporte différemment de FALSE avec NOT.
Un filtre qui élimine discrètement des lignes
Voici l’exemple classique, présenté étape par étape. Supposons que bonus puisse parfois être NULL. Un recruteur vous demande : « Cette requête devrait renvoyer tous les employés dont la prime n’est pas de 1000. Pourquoi ignore-t-elle les employés sans prime ? »
Pour une ligne où bonus est NULL, bonus <> 1000 donne UNKNOWN et non TRUE. WHERE ne conserve que les lignes dont le résultat est TRUE ; ces employés disparaissent donc.
La correction consiste à gérer explicitement NULL, ce que nous verrons dans la leçon suivante. Pour le moment, retenez que les lignes manquantes sont une conséquence logique, et non un bogue.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUENULL dans les expressions AND
La logique à trois valeurs modifie le comportement de AND. Mémorisez cette règle et vous pourrez répondre immédiatement à toute question sur une table de vérité.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
L’idée à retenir : AND n’a besoin que d’un seul FALSE pour produire définitivement FALSE. Ainsi, FALSE AND n’importe quoi reste FALSE. En revanche, TRUE AND une valeur inconnue reste inconnu, car la partie inconnue pourrait finalement prendre l’une ou l’autre valeur.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedNULL dans les expressions OR
OR suit le principe inverse de AND. Il lui suffit d’un seul TRUE pour produire définitivement TRUE ; TRUE suffit donc à écarter l’incertitude.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
Une ligne peut donc correspondre à une condition OR même si l’une des branches est inconnue, à condition qu’une autre branche soit réellement TRUE. C’est une question de suivi fréquente après celle sur AND.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT inverse TRUE/FALSE, mais pas UNKNOWN
Voici le point subtil que les recruteurs gardent souvent pour la fin. NOT transforme TRUE en FALSE et FALSE en TRUE, mais NOT UNKNOWN reste UNKNOWN.
C’est pourquoi vous ne pouvez pas simplement placer une condition qui échoue dans NOT pour inverser le résultat. Si bonus = 1000 donne UNKNOWN pour une ligne où bonus est NULL, alors NOT (bonus = 1000) donne également UNKNOWN et la ligne reste exclue.
La négation ne permet pas de récupérer les lignes contenant NULL. Seul un contrôle explicite avec IS NULL le permet.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);Exemple détaillé : le piège de NOT IN
C’est l’une des énigmes sur NULL les plus fréquemment posées. NOT IN avec une liste contenant NULL ne renvoie aucune ligne, ce qui surprend les candidats qui s’attendent à ce que NULL soit simplement ignoré.
En interne, x NOT IN (1, 2, NULL) devient x <> 1 AND x <> 2 AND x <> NULL. Cette dernière comparaison donne UNKNOWN, et TRUE AND TRUE AND UNKNOWN se réduit à UNKNOWN ; aucune ligne n’est donc retenue.
L’alternative fiable est NOT EXISTS, qui n’est pas exposée à ce problème.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.Pourquoi UNKNOWN se comporte comme FALSE dans WHERE
Une question de suivi fréquente est la suivante : « Si UNKNOWN n’est pas FALSE, pourquoi la ligne est-elle éliminée comme une ligne FALSE ? »
La réponse est précise : WHERE, ON et HAVING appliquent tous une règle qui ne conserve que TRUE. FALSE et UNKNOWN échouent tous deux à cette vérification ; pour le filtrage, ils semblent donc identiques.
La différence apparaît uniquement avec la négation et les contraintes CHECK. Une contrainte CHECK accepte une ligne lorsque la condition est TRUE ou UNKNOWN ; une valeur NULL peut donc passer malgré une contrainte CHECK que vous pensiez bloquante.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowedExemple approfondi : COUNT et l’écart de logique booléenne
Reliez tout cela à un énoncé d’entretien réaliste. « Nous avons 100 employés. SELECT COUNT(*) WHERE bonus = 100 renvoie 30, et WHERE bonus <> 100 renvoie 50. Où sont les 20 autres ? »
Les 20 employés manquants ont une prime NULL. Ni = 100 ni <> 100 ne donne TRUE pour eux : les deux résultats sont UNKNOWN, si bien qu’ils ne passent aucun des deux filtres.
Dire « les catégories ne totalisent pas le total parce que NULL ne satisfait aucun des deux prédicats » est exactement la réponse attendue par les recruteurs.
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;Points clés à mentionner en entretien
Lorsque la logique de NULL est abordée, mentionnez ces points pour montrer votre expérience :
- NULL représente l’inconnu ; les comparaisons avec lui produisent UNKNOWN.
- SQL utilise une logique à trois valeurs : TRUE, FALSE, UNKNOWN.
- WHERE, ON et HAVING ne conservent que les lignes TRUE.
NOT UNKNOWNreste UNKNOWN ; la négation ne permet donc pas de récupérer les lignes contenant NULL.NOT INavec NULL renvoie zéro ligne ; préférezNOT EXISTS.
Présentez d’abord le modèle, puis parcourez la table de vérité. Cet ordre montre que vous comprenez la raison du comportement, et pas seulement l’astuce.
Vérification rapide
Évaluez votre compréhension de la logique à trois valeurs.
Récapitulatif
Vous disposez maintenant du modèle mental fondamental de NULL :
- NULL représente l’inconnu, et non une valeur ; ne le comparez jamais avec
=ou<>. - SQL fonctionne avec trois valeurs : les prédicats renvoient TRUE, FALSE ou UNKNOWN.
- Les clauses de filtrage ne conservent que TRUE ; les lignes UNKNOWN disparaissent comme les lignes FALSE.
NOTinverse TRUE et FALSE, mais laisse UNKNOWN inchangé.- Le piège de
NOT INavec NULL renvoie zéro ligne ; utilisez plutôtNOT EXISTS.
Ensuite : la bonne manière de tester NULL avec IS NULL, IS NOT NULL et les opérateurs d’égalité compatibles avec NULL.
Questions Fréquemment Posées
La leçon « Logique à trois valeurs et UNKNOWN » est-elle gratuite ?
Oui — le texte complet de « Logique à trois valeurs et UNKNOWN » 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 « Logique à trois valeurs et UNKNOWN » ?
Pourquoi NULL = NULL n’est pas vrai et comment UNKNOWN se propage dans les conditions 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 1 sur 4.
Combien de temps prend la leçon « Logique à trois valeurs et UNKNOWN » ?
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
- Logique à trois valeurs et UNKNOWN
- IS NULL, IS NOT NULL et égalité compatible avec NULL
- COALESCE, NULLIF et ISNULL
- NULL dans les agrégats, les jointures et DISTINCT