IS NULL et IS NOT NULL
Testez correctement les valeurs manquantes.
IS NULL et IS NOT NULL est une leçon SQL Academy 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 Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Tester les valeurs manquantes
Comme les comparaisons avec NULL renvoient toujours unknown, SQL fournit deux opérateurs dédiés pour tester les valeurs manquantes : IS NULL et IS NOT NULL.
Ce sont les seuls moyens fiables de trouver ou d'exclure les NULL. Dans cette leçon, vous apprendrez à les utiliser correctement.
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;Pourquoi = NULL échoue
Il peut être tentant d'écrire WHERE phone = NULL, mais cette expression ne correspond jamais à aucune ligne. La condition donne le résultat unknown pour chaque ligne, et WHERE ne conserve que les lignes vraies.
Le résultat est un ensemble vide — une erreur silencieuse, car aucune erreur n'est signalée.
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;IS NULL en pratique
IS NULL renvoie true exactement lorsque la valeur est manquante, et false dans les autres cas. Il ne renvoie jamais unknown.
Vous pouvez donc l'utiliser en toute sécurité partout où vous avez besoin d'un résultat clairement vrai ou faux.
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tIS NOT NULL en pratique
IS NOT NULL fait exactement l'inverse : il renvoie true lorsque la valeur est présente et false lorsqu'elle est manquante.
Utilisez-le pour ne conserver que les lignes qui contiennent réellement des données, par exemple les clients que vous pouvez appeler.
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101Combiner avec AND / OR
Vous pouvez combiner les tests de NULL avec d'autres conditions à l'aide de AND et OR.
Par exemple, vous pouvez trouver les clients actifs pour lesquels un numéro de téléphone doit encore être renseigné — une requête courante pour contrôler la qualité des données.
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNULL dans NOT IN : un piège
NOT IN se comporte mal lorsque la liste contient un NULL. Si l'ensemble contient une valeur NULL, NOT IN peut renvoyer unknown pour chaque ligne et supprimer des résultats attendus.
Préférez NOT EXISTS ou filtrez d'abord les NULL de la sous-requête.
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
PostgreSQL propose IS DISTINCT FROM et IS NOT DISTINCT FROM — des opérateurs de comparaison qui gèrent les NULL.
Contrairement à =, ils considèrent deux NULL comme égaux et un NULL comparé à une valeur comme différent, en renvoyant toujours true ou false, jamais unknown.
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueComparer deux colonnes pouvant contenir NULL
Lorsque vous comparez deux colonnes qui peuvent toutes les deux contenir NULL, un simple = ne détecte pas le cas où elles sont toutes les deux NULL. IS NOT DISTINCT FROM le gère correctement.
C'est très utile pour trouver les lignes qui n'ont pas changé, même lorsque la valeur est inconnue.
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;Compter les NULL
Une utilisation pratique de IS NULL consiste à contrôler la qualité des données en comptant le nombre de lignes auxquelles une valeur manque.
Combinez-le avec FILTER (PostgreSQL) ou avec un CASE dans COUNT pour compter côte à côte les NULL et les valeurs non NULL.
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;Tests de NULL dans les contraintes CHECK
Vous pouvez utiliser des tests de NULL dans des contraintes CHECK pour imposer des règles comme « si une ligne est expédiée, elle doit avoir une date d'expédition ».
Remarque : une contrainte CHECK est respectée lorsque sa condition est true ou unknown. Réfléchissez donc attentivement aux cas impliquant NULL.
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);Bonnes pratiques
Adoptez ces habitudes pour éviter les problèmes liés aux NULL :
- Testez toujours avec
IS NULL/IS NOT NULL, jamais avec= NULL. - Méfiez-vous de
NOT INavec les sous-requêtes pouvant renvoyer NULL. - Utilisez
IS DISTINCT FROMpour une égalité qui gère les NULL. - Contrôlez les données manquantes avec
count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bVérification rapide
Vous voulez tous les clients dont la colonne phone n'a aucune valeur. Quelle clause WHERE est correcte ?
Récapitulatif
Vous avez appris à vérifier correctement les valeurs manquantes avec IS NULL et IS NOT NULL, ainsi que la raison pour laquelle = NULL ne fonctionne jamais.
Vous avez également découvert le piège de NOT IN, l'opérateur IS DISTINCT FROM qui gère NULL, ainsi que la manière de contrôler les NULL avec FILTER. Vous allez maintenant apprendre à remplacer les NULL par des valeurs par défaut pertinentes à l'aide de COALESCE et NULLIF.
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;Questions Fréquemment Posées
La leçon « IS NULL et IS NOT NULL » est-elle gratuite ?
Oui — le texte complet de « IS NULL et IS NOT 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 Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « IS NULL et IS NOT NULL » ?
Testez correctement les valeurs manquantes. Tu pratiques SQL Academy 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 Academy ?
Aucune expérience préalable n'est requise. SQL Academy 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 et IS NOT 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 Academy ?
Oui. Chaque leçon SQL Academy 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
- Ce que signifie vraiment NULL
- IS NULL et IS NOT NULL
- COALESCE et NULLIF
- Les valeurs NULL dans les agrégations et les jointures