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
| titre | annee | budget_dollars |
|---|---|---|
| Inception | 2010 | 160 000 000 |
| Le Parrain | 1972 | (NULL) |
| Pulp Fiction | 1994 | 8 000 000 |
| Amélie Poulain | 2001 | (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é :
SELECT titre FROM films WHERE budget_dollars IS NULL| 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 :
SELECT titre, budget_dollars FROM films WHERE budget_dollars IS NOT NULL| titre | budget_dollars |
|---|---|
| Inception | 160 000 000 |
| Pulp Fiction | 8 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 :
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.