Fondamentaux

NULL et COALESCE en SQL : gérer les valeurs manquantes

Traitez les valeurs absentes explicitement pour produire des filtres, calculs et rapports fiables.

Équipe SQL.tn10 min
Éditeur SQL illustrant le traitement de valeurs manquantes dans une table

Que signifie NULL en SQL ?

NULL signale l’absence d’une valeur connue. Il ne représente ni zéro, ni une chaîne vide, ni le texte « NULL ». Une date de livraison NULL peut par exemple signifier que la commande n’a pas encore été livrée.

Cette nuance est essentielle : remplacer automatiquement une absence par zéro peut transformer une information inconnue en affirmation incorrecte. Avant toute requête, documentez la raison pour laquelle la colonne accepte NULL.

Les personnes, commandes et coordonnées de cet article sont fictives et servent uniquement à l’apprentissage.

Rechercher une valeur absente avec IS NULL

La condition telephone = NULL ne retourne pas les lignes attendues. Une comparaison avec une valeur inconnue produit un résultat lui-même inconnu, que WHERE ne conserve pas.

SQL fournit donc les opérateurs IS NULL et IS NOT NULL. Le premier recherche les absences ; le second conserve les valeurs renseignées.

  • Correct : telephone IS NULL.
  • Correct : telephone IS NOT NULL.
  • Incorrect : telephone = NULL ou telephone <> NULL.
Clients sans numéro de téléphone
SELECT id_client, nom
FROM clients
WHERE telephone IS NULL
ORDER BY id_client ASC;

Pourquoi NULL change-t-il les conditions ?

Une condition SQL peut être vraie, fausse ou inconnue. Si remise vaut NULL, les expressions remise = 0, remise > 0 et remise <> 0 sont inconnues : aucune ne permet de déduire le montant réel.

Cette logique explique pourquoi une condition négative ne récupère pas forcément toutes les autres lignes. Lorsque la règle doit inclure les absences, écrivez-le explicitement avec OR remise IS NULL.

Produits sans remise positive
SELECT produit, remise
FROM produits
WHERE remise = 0
   OR remise IS NULL;

COALESCE retourne la première valeur disponible

COALESCE lit ses arguments de gauche à droite et renvoie le premier qui n’est pas NULL. Cette fonction est pratique pour afficher un libellé de remplacement ou choisir entre plusieurs moyens de contact.

Elle ne modifie pas la donnée enregistrée. Le remplacement existe uniquement dans le résultat de la requête, ce qui permet de conserver l’information d’origine.

Choisir le meilleur contact disponible
SELECT
  nom,
  COALESCE(telephone, email, 'Non renseigné') AS contact
FROM clients
ORDER BY nom ASC;
Les arguments de COALESCE doivent avoir des types compatibles. Un texte de remplacement convient à une colonne texte, pas directement à un calcul numérique.

Remplacer NULL dans un calcul seulement si la règle le permet

Une quantité NULL rend généralement un calcul arithmétique inconnu. Si le modèle métier établit qu’une remise absente équivaut bien à zéro, COALESCE peut rendre cette règle explicite.

En revanche, un revenu inconnu ne devrait pas être transformé arbitrairement en revenu nul. Cette décision diminuerait artificiellement une moyenne et pourrait fausser un indicateur.

  • Définissez le sens de NULL avant le calcul.
  • Utilisez une valeur de remplacement du même type.
  • Conservez l’absence si elle porte une information utile.
Prix net avec remise facultative
SELECT
  produit,
  prix - COALESCE(remise, 0) AS prix_net
FROM produits;

COUNT, SUM et AVG ne traitent pas tous NULL de la même façon

COUNT(*) compte toutes les lignes, alors que COUNT(colonne) ignore les valeurs NULL de cette colonne. Cette différence permet de mesurer facilement le nombre total de clients et le nombre de téléphones renseignés.

SUM et AVG ignorent aussi les valeurs NULL. Utiliser AVG(COALESCE(note, 0)) ajoute au contraire les absences au dénominateur avec une valeur zéro : le résultat n’a donc plus le même sens.

Mesurer le taux de renseignement
SELECT
  COUNT(*) AS nombre_clients,
  COUNT(telephone) AS telephones_renseignes,
  ROUND(100.0 * COUNT(telephone) / NULLIF(COUNT(*), 0), 1) AS taux_renseignement
FROM clients;

Les erreurs courantes à éviter

Le traitement de NULL doit être visible dans la requête et justifié par le besoin métier, pas ajouté uniquement pour faire disparaître des cases vides.

  • Comparer une colonne à NULL avec = ou <>.
  • Confondre NULL, zéro et chaîne vide.
  • Utiliser COALESCE sans vérifier la compatibilité des types.
  • Remplacer les absences par zéro avant AVG sans justification.
  • Oublier qu’une concaténation ou une opération peut devenir NULL selon le moteur SQL.

Une méthode fiable en quatre questions

Demandez d’abord pourquoi la valeur est absente, puis si cette absence doit être conservée, filtrée ou remplacée. Choisissez ensuite IS NULL, IS NOT NULL ou COALESCE selon la réponse.

Enfin, contrôlez le nombre de lignes et recalculez un petit échantillon à la main. L’exercice dédié à COALESCE permet d’appliquer cette méthode sur une table clients simple.

À vous d’écrire la requête.

Vérifiez SELECT et FROM sur un exercice gratuit avant de poursuivre.

Ouvrir l’exercice