SQL NULL : gérer les valeurs manquantes
Dans une table, certaines informations peuvent manquer : un âge non renseigné, un employé sans manager… SQL représente ces cases vides par une valeur spéciale, NULL. C'est l'une des notions qui piège le plus les débutants, car NULL ne se compare pas comme une valeur normale.
Syntaxe
WHERE colonne IS NULL
WHERE colonne IS NOT NULL
COALESCE(colonne, valeur_par_defaut)Comment ça marche
NULL veut dire « inconnu »
NULL n'est ni 0, ni une chaîne vide : c'est l'absence de valeur. Comparer quelque chose à une valeur inconnue donne un résultat inconnu. C'est pourquoi age = NULL n'est jamais vrai, même quand l'âge est manquant.
Pour tester une valeur manquante, il existe deux opérateurs dédiés : IS NULL et IS NOT NULL.
NULL dans les calculs
- Un calcul avec NULL donne NULL :
NULL + 5vaut NULL. - Les fonctions d'agrégation
SUM,AVG,MIN,MAXetCOUNT(colonne)ignorent les NULL.COUNT(*), lui, compte toutes les lignes.
Remplacer NULL par une valeur
COALESCE(a, b, c) renvoie la première valeur non NULL de la liste. COALESCE(age, 0) affiche 0 à la place d'un âge manquant. SQLite propose aussi IFNULL(a, b).
Schéma
| prenom | age |
|---|---|
| Léa | 34 |
| Hugo | NULL |
| Inès | 27 |
| Adam | NULL |
| prenom | age |
|---|---|
| Hugo | NULL |
| Adam | NULL |
Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).
Exemples avec leurs résultats
1. Trouver les valeurs manquantes
Les clients dont l'âge n'est pas renseigné.
SELECT prenom, nom, age
FROM clients
WHERE age IS NULL; Essayer dans le bac à sable| prenom | nom | age |
|---|---|---|
| Clara | Faure | NULL |
| Lucas | Blanc | NULL |
| Karim | Fontaine | NULL |
| Clara | Lefebvre | NULL |
4 lignes au total
2. Remplacer NULL à l'affichage
COALESCE remplace l'âge manquant par un texte.
SELECT prenom, nom, COALESCE(age, 'non renseigné') AS age
FROM clients
WHERE age IS NULL OR id <= 3; Essayer dans le bac à sable| prenom | nom | age |
|---|---|---|
| Samir | Dubois | 59 |
| Samir | Martin | 25 |
| Zoé | Laurent | 36 |
| Clara | Faure | non renseigné |
| Lucas | Blanc | non renseigné |
| Karim | Fontaine | non renseigné |
| Clara | Lefebvre | non renseigné |
7 lignes au total
3. COUNT(*) contre COUNT(colonne)
COUNT(*) compte toutes les lignes, COUNT(age) seulement celles où l'âge est connu.
SELECT COUNT(*) AS clients, COUNT(age) AS ages_connus
FROM clients; Essayer dans le bac à sable| clients | ages_connus |
|---|---|
| 120 | 116 |
1 ligne au total
4. Les employés sans manager
Le PDG n'a pas de manager : sa colonne manager_id vaut NULL.
SELECT prenom, nom, poste
FROM employes
WHERE manager_id IS NULL; Essayer dans le bac à sable| prenom | nom | poste |
|---|---|---|
| Chloé | Dubois | PDG |
1 ligne au total
Les erreurs fréquentes
Écrire = NULL
La condition = NULL n'est jamais vraie : la requête ne renvoie aucune ligne, sans message d'erreur.
SELECT * FROM clients WHERE age = NULL;SELECT * FROM clients WHERE age IS NULL;Oublier les NULL avec <>
age <> 30 écarte aussi les âges inconnus, car comparer NULL ne donne jamais vrai. Ajoutez OR age IS NULL si vous voulez les garder.
SELECT COUNT(*) FROM clients WHERE age <> 30;SELECT COUNT(*) FROM clients WHERE age <> 30 OR age IS NULL;Confondre NULL et chaîne vide
Une chaîne vide '' est une vraie valeur (du texte de longueur 0). Elle n'est pas trouvée par IS NULL.
SELECT * FROM clients WHERE email = NULL;SELECT * FROM clients WHERE email IS NULL OR email = '';Exercices
Essayez d'écrire la requête vous-même avant d'ouvrir la solution.
Défi 1. Comptez le nombre de clients dont l'âge est renseigné.
Voir une solution
SELECT COUNT(*) FROM clients WHERE age IS NOT NULL;| COUNT(*) |
|---|
| 116 |
1 ligne au total
Essayer dans le bac à sableDéfi 2. Affichez le prénom de chaque employé et son manager_id, en remplaçant les manager_id manquants par 0.
Voir une solution
SELECT prenom, COALESCE(manager_id, 0) AS manager FROM employes;| prenom | manager |
|---|---|
| Chloé | 0 |
| Jade | 1 |
| Nathan | 1 |
| Samir | 1 |
| Alice | 2 |
| Nathan | 2 |
| Lucas | 2 |
| Emma | 2 |
25 lignes au total · 8 affichées
Essayer dans le bac à sableLes exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.
Questions fréquentes
Pourquoi WHERE colonne = NULL ne renvoie rien ?
Parce que NULL signifie « inconnu » : comparer une valeur à un inconnu ne donne ni vrai ni faux, mais inconnu, et WHERE ne garde que les conditions vraies. Il faut écrire IS NULL.
Quelle différence entre COALESCE et IFNULL ?
IFNULL(a, b) accepte deux valeurs et existe en SQLite et MySQL. COALESCE accepte autant de valeurs que l'on veut et fait partie du SQL standard : il marche partout.
AVG tient-il compte des NULL ?
Non, AVG ignore les NULL : il fait la moyenne des seules valeurs connues. Pour compter les NULL comme 0, écrivez AVG(COALESCE(colonne, 0)).