Les valeurs manquantes

Un champ email laissé vide en base n'est pas une chaîne vide — c'est NULL, une absence de valeur que PostgreSQL traite comme une inconnue. La conséquence inattendue : WHERE email = NULL ne renvoie aucune ligne, même quand des emails manquants existent bien.

Quand une donnée est absente

Dans une vraie base de données, toutes les cases ne sont pas toujours remplies. Un budget peut ne pas avoir été renseigné pour un film ancien, une date peut manquer dans un catalogue. Cette absence a un nom en SQL : NULL.

La table films a une colonne budget_dollars qui enregistre le budget de production. Mais tous les budgets ne sont pas connus :

Table films — budget_dollars

titreanneebudget_dollars
Inception2010160 000 000
Le Parrain1972(NULL)
Pulp Fiction19948 000 000
Amélie Poulain2001(NULL)

Deux films n'ont pas de budget enregistré. Ce n'est pas 0 — la base ne sait simplement pas. Et en SQL, cette absence se gère différemment des autres valeurs.

NULL : pas zéro, pas vide

NULL signifie « aucune valeur connue ». Ce n'est pas le chiffre 0 — qui serait un budget réel. Ce n'est pas non plus une chaîne vide '' — qui serait du texte vide. C'est littéralement *l'absence d'information*.

Cette nuance a une conséquence directe pour les filtres. Comparer quelque chose à NULL donne toujours un résultat « inconnu » — ni vrai ni faux. C'est pourquoi WHERE budget_dollars = NULL ne renvoie aucune ligne : pas une erreur de syntaxe, mais zéro résultat, parce qu'on ne peut pas comparer une valeur connue à une absence. Pour tester NULL, SQL a un opérateur dédié : IS NULL.

IS NULL : trouver les manquants

Pour trouver les lignes où une valeur est absente, on utilise IS NULL. La syntaxe est WHERE colonne IS NULL — sans apostrophes, sans valeur : on teste l'absence elle-même. Par exemple, les films dont le budget n'est pas renseigné :

La requête
SELECT titre FROM films WHERE budget_dollars IS NULL
Résultat · 2 lignes
titre
Le Parrain
Amélie Poulain

Les deux films sans budget enregistré ressortent. = NULL ne fonctionnerait pas — pas d'erreur de syntaxe, mais zéro ligne, parce que comparer à une absence donne toujours « inconnu ». La règle : avec NULL, toujours IS, jamais =.

IS NOT NULL : trouver les présents

À l'inverse, IS NOT NULL garde les lignes où la valeur est présente. Utile pour filtrer les données renseignées et écarter les absences. Les films dont le budget est connu :

La requête
SELECT titre, budget_dollars FROM films WHERE budget_dollars IS NOT NULL
Résultat · 2 lignes
titrebudget_dollars
Inception160 000 000
Pulp Fiction8 000 000

Seuls les deux films avec un budget enregistré apparaissent. IS NOT NULL est la forme positive de IS NULL : l'un garde les absences, l'autre garde les présences.

Récapitulatif

En résumé, pour gérer les valeurs manquantes :

📌 Les valeurs manquantes — l'essentiel
IS NULL→ valeur absente (manquante)
IS NOT NULL→ valeur présente (renseignée)
⚠ = NULL→ ne fonctionne pas — renvoie toujours zéro ligne
Exemple complet
SELECT titre FROM films WHERE budget_dollars IS NULL

💡 Bon à savoir : IS NULL et IS NOT NULL se combinent avec AND et OR comme n'importe quelle condition — par exemple WHERE budget_dollars IS NULL AND note > 9.0.

Passe à la pratique

Cette leçon t'a montré la théorie. Pour maîtriser SQL, rien ne vaut la pratique : accède aux exercices et au bac à sable PostgreSQL réel.

← Tous les cours SQL