0Pricing
SQL Interview Prep · Leçon

IS NULL, IS NOT NULL et égalité compatible avec NULL

Tester correctement la présence de NULL et découvrir les opérateurs compatibles avec NULL selon le dialecte

IS NULL, IS NOT NULL et égalité compatible avec NULL 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.

Tester NULL de la bonne manière

La leçon précédente a démontré que vous ne pouvez pas utiliser = pour détecter NULL. Comment faut-il donc procéder ? Avec les prédicats dédiés IS NULL et IS NOT NULL.

Ce sont les seuls moyens corrects et portables de vérifier la présence de valeurs manquantes, et les recruteurs rejetteront systématiquement col = NULL s’ils le voient.

Cette leçon traite de IS NULL, IS NOT NULL, de la famille IS DISTINCT FROM et des opérateurs d’égalité compatibles avec NULL propres à certains dialectes. Connaître les différences entre les bases de données est un signe d’expérience avancée.

IS NULL et IS NOT NULL

IS NULL renvoie TRUE lorsque la valeur est NULL et FALSE dans le cas contraire. Surtout, il ne renvoie jamais UNKNOWN ; vous pouvez donc l’utiliser directement dans WHERE en toute sécurité.

IS NOT NULL est son complément exact : TRUE pour toute valeur réelle et FALSE pour NULL.

Ces prédicats sont les outils essentiels pour gérer NULL. Ils font partie du SQL standard et se comportent de manière identique avec MySQL, Postgres, SQL Server, Oracle et SQLite.

-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;

-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;

Pourquoi col = NULL est toujours incorrect

Voici un piège incontournable en entretien : un candidat écrit WHERE bonus = NULL en pensant trouver les primes manquantes. La requête renvoie zéro ligne.

Rappelez-vous la logique à trois valeurs : bonus = NULL donne UNKNOWN pour chaque ligne, y compris celles où la valeur est NULL, car rien n’est égal à une valeur inconnue. WHERE ne conserve que TRUE ; rien ne correspond donc.

Certaines bases de données, dans des modes non standard, réécrivent silencieusement = NULL en IS NULL, mais vous ne devez jamais compter là-dessus. Écrivez toujours IS NULL explicitement.

-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;

-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;

Compter les valeurs NULL et non NULL

Une tâche courante pour les analystes consiste à auditer la qualité des données : quelle est la complétude d’une colonne ? Combinez IS NULL avec COUNT pour signaler les valeurs manquantes.

Remarquez la différence : COUNT(*) compte chaque ligne, tandis que COUNT(bonus) compte uniquement les primes non NULL. La différence entre les deux correspond au nombre de valeurs NULL, un point que nous reverrons dans la leçon consacrée aux agrégats.

SELECT
  COUNT(*)                                AS total_rows,
  COUNT(bonus)                            AS with_bonus,
  COUNT(*) - COUNT(bonus)                 AS missing_bonus,
  SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;

Le problème résolu par l’égalité compatible avec NULL

Supposons que vous vouliez comparer deux colonnes et considérer « toutes deux NULL » comme une correspondance. Une simple comparaison a = b échoue : lorsque les deux valeurs sont NULL, le résultat est UNKNOWN et la paire est exclue, même si elle semble intuitivement « identique ».

Ce cas se présente lorsque vous comparez une ancienne ligne à une nouvelle pour détecter des changements, ou lorsque vous effectuez une jointure sur des colonnes facultatives. Vous avez besoin d’une comparaison dans laquelle NULL et NULL donnent TRUE et NULL contre une valeur donne FALSE. C’est ce que fournit l’égalité compatible avec NULL.

-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
--   NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note;  -- misses rows where both notes are NULL

IS DISTINCT FROM (SQL standard)

La comparaison compatible avec NULL normalisée par ANSI est IS DISTINCT FROM, ainsi que son inverse IS NOT DISTINCT FROM. Elle est prise en charge par Postgres, SQL Server (2022+) et d’autres systèmes.

  • a IS NOT DISTINCT FROM b signifie « égal, en considérant NULL = NULL comme une égalité ».
  • a IS DISTINCT FROM b signifie « différent, en traitant NULL comme une valeur normale ».

Ces opérateurs renvoient toujours TRUE ou FALSE, jamais UNKNOWN ; ils peuvent donc être utilisés en toute sécurité partout où un prédicat est attendu.

-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;

-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;

L’opérateur <=> de MySQL

MySQL fournit un opérateur d’égalité compact et compatible avec NULL, écrit <=> (l’opérateur en forme de vaisseau spatial).

a <=> b renvoie 1 (TRUE) lorsque les deux côtés sont égaux ou tous deux NULL, et 0 (FALSE) dans le cas contraire. C’est l’équivalent MySQL de IS NOT DISTINCT FROM.

Si un recruteur vous demande comment effectuer une comparaison compatible avec NULL spécifiquement en MySQL, c’est la réponse idiomatique.

-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null,   -- 1
       (NULL <=> 5)    AS null_vs_val, -- 0
       (5 <=> 5)       AS val_eq;      -- 1

SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;

Fiche mémo inter-dialectes

Les recruteurs apprécient les candidats qui connaissent les limites de portabilité. Voici le tableau des équivalences compatibles avec NULL :

  • ANSI / Postgres / SQL Server 2022+ : IS NOT DISTINCT FROM
  • MySQL / MariaDB : <=>
  • SQLite : IS et IS NOT fonctionnent comme des opérateurs d’égalité compatibles avec NULL
  • Oracle : aucun opérateur natif ; simulez ce comportement avec DECODE(a, b, 1, 0) = 1 ou avec des astuces reposant sur COALESCE

Si vous ne connaissez pas le moteur utilisé, utilisez la solution de repli manuelle et portable présentée ensuite.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

Correspondance manuelle portable compatible avec NULL

Lorsqu’aucun opérateur natif n’est disponible, vous pouvez construire une égalité compatible avec NULL à partir d’éléments de base. Ce modèle portable combine une égalité normale avec une clause explicite pour le cas où les deux valeurs sont NULL.

Interprétez-le ainsi : « elles sont égales OU elles sont toutes les deux absentes ». Cette solution fonctionne avec toutes les bases de données, ce qui en fait une excellente réponse lorsque le recruteur ne précise pas le dialecte.

SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
   OR (o.note IS NULL AND n.note IS NULL);

-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')

Exemple approfondi&nbsp;: clés de JOIN compatibles avec NULL

Voici un piège réaliste : effectuer une jointure sur une clé pouvant être NULL. Si region peut être NULL des deux côtés, une équijointure ordinaire élimine silencieusement ces paires, car NULL = NULL vaut UNKNOWN.

Si la règle métier est la suivante : « les lignes sans région doivent tout de même correspondre à d’autres lignes sans région », vous devez rendre la condition de jointure compatible avec NULL. Énoncez clairement cette hypothèse pendant l’entretien, puis choisissez l’opérateur correspondant au moteur utilisé.

-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
  ON a.region IS NOT DISTINCT FROM b.region;

-- MySQL equivalent: ON a.region <=> b.region

Points à aborder en entretien

Pour traiter clairement toute question sur le test de NULL :

  • Utilisez toujours IS NULL / IS NOT NULL ; n’utilisez jamais = NULL.
  • Ces prédicats renvoient uniquement TRUE ou FALSE : ils peuvent donc être utilisés sans risque dans WHERE.
  • Pour comparer deux NULL comme des valeurs égales, utilisez IS NOT DISTINCT FROM (ANSI) ou <=> (MySQL).
  • Précisez le dialecte visé ; si vous avez un doute, proposez la solution de repli portable fondée sur une clause OR.

Citer à la fois l’opérateur standard et celui du fournisseur montre une maîtrise étendue que les recruteurs remarquent.

Vérification rapide

Choisissez la comparaison correcte compatible avec NULL.

Récapitulatif

Vous savez maintenant tester correctement la présence de NULL :

  • IS NULL / IS NOT NULL sont les seuls tests de NULL corrects et portables ; ils ne renvoient jamais UNKNOWN.
  • col = NULL renvoie toujours zéro ligne : c’est un piège classique des entretiens.
  • L’égalité compatible avec NULL considère deux NULL comme égaux : IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
  • Lorsqu’aucun opérateur n’existe, utilisez (a = b) OR (a IS NULL AND b IS NULL).

Ensuite : remplacer les valeurs NULL par défaut avec COALESCE, NULLIF et des fonctions propres à certains fournisseurs, comme ISNULL.

Questions Fréquemment Posées

La leçon « IS NULL, IS NOT NULL et égalité compatible avec NULL » est-elle gratuite ?

Oui — le texte complet de « IS NULL, IS NOT NULL et égalité compatible avec NULL » 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 « IS NULL, IS NOT NULL et égalité compatible avec NULL » ?

Tester correctement la présence de NULL et découvrir les opérateurs compatibles avec NULL selon le dialecte 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 « IS NULL, IS NOT NULL et égalité compatible avec NULL » ?

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. Logique à trois valeurs et UNKNOWN
  2. IS NULL, IS NOT NULL et égalité compatible avec NULL
  3. COALESCE, NULLIF et ISNULL
  4. NULL dans les agrégats, les jointures et DISTINCT
← Retour à SQL Interview Prep