Niveau 12 : Gérer les valeurs manquantes (NULL)

Niveau 12 : Gérer les valeurs manquantes (NULL)

Mis à jour le

Intermédiaire · niveau 12 sur 20. Objectif : Comprendre le comportement de NULL et remplacer les valeurs manquantes.

Notions : NULL COALESCE NULLIF COUNT et NULL

Leçon

NULL veut dire « valeur inconnue ». Ce n'est ni zéro, ni un texte vide : c'est une absence d'information. Un contact sans téléphone n'a pas le numéro 0, il a un numéro inconnu.

Comme la valeur est inconnue, presque tout calcul qui la touche donne un résultat inconnu : 5 + NULL vaut NULL, 'a' || NULL aussi. Une comparaison avec NULL ne donne ni vrai ni faux, mais inconnu : phone = NULL est inconnu, et même NULL = NULL, car deux valeurs inconnues ne sont pas forcément égales.

SQL raisonne donc avec trois valeurs : vrai, faux et inconnu. Règle décisive : WHERE ne garde que les lignes où la condition est vraie, et écarte les lignes « inconnu » comme les lignes « faux ». C'est pourquoi WHERE phone <> '0612345678' écarte aussi les contacts sans téléphone : pour eux, le test est inconnu.

Avec AND et OR, l'inconnu se combine logiquement : faux AND inconnu vaut faux, vrai OR inconnu vaut vrai, mais vrai AND inconnu reste inconnu. Le piège du NOT IN vient de là : x NOT IN (1, NULL) signifie x <> 1 AND x <> NULL ; la seconde moitié est toujours inconnue, donc la condition n'est jamais vraie.

Pour tester NULL, on utilise IS NULL et IS NOT NULL, qui répondent toujours vrai ou faux.

Pour remplacer une valeur manquante, COALESCE(a, b, c) renvoie la première valeur non NULL de la liste : COALESCE(phone, 'unknown') affiche 'unknown' quand le téléphone manque.

NULLIF(a, b) fait l'inverse : il renvoie NULL si a = b, sinon a. Il sert surtout à protéger une division : x / NULLIF(y, 0) donne NULL au lieu d'une erreur de division par zéro dans la plupart des moteurs (SQLite, lui, renvoie déjà NULL).

Enfin, les agrégats ignorent les NULL : COUNT(*) - COUNT(phone) donne le nombre de téléphones manquants.

Syntaxe

SELECT COALESCE(col1, col2, 'défaut'), x / NULLIF(y, 0)
FROM ma_table
WHERE col IS NOT NULL;

Exemple commenté

SELECT name, COALESCE(email, 'no email') AS email
FROM contacts;

Les contacts sans adresse affichent 'no email' au lieu d'une case vide.

Table contacts (5 lignes)
idnameemailphonecity
1Alice Martinalice@mail.com0612345678Paris
2bob durandNULL0698765432Lyon
3CLAIRE ROUXclaire@work.orgNULLNULL
4David LefevreNULLNULLNantes
5Emma Petitemma@mail.com0611223344NULL

Résultat de l’exemple

nameemail
Alice Martinalice@mail.com
bob durandno email
CLAIRE ROUXclaire@work.org
David Lefevreno email
Emma Petitemma@mail.com

À retenir

  • NULL = inconnu : on le teste avec IS NULL.
  • COALESCE remplace NULL par la première valeur connue.
  • NULLIF(y, 0) protège une division.

Pièges fréquents

  • WHERE phone <> '0612345678' écarte aussi les téléphones NULL.
  • COALESCE doit recevoir des valeurs de même nature : texte avec texte, nombre avec nombre.

Les 5 exercices du niveau

  1. Guidé · Affiche le nom de chaque contact et son téléphone, en affichant 'unknown' quand il manque. (Table : contacts)
  2. Entraînement · Affiche le nom de chaque contact et son meilleur moyen de contact : l'e-mail s'il existe, sinon le téléphone, sinon 'no contact'. (Table : contacts)
  3. Entraînement · Pour chaque match, affiche l'identifiant, les buts des deux équipes et le rapport buts à domicile / buts à l'extérieur, arrondi à 2 décimales (goal_ratio). Quand l'équipe visiteuse n'a pas marqué, le rapport doit être vide (NULL). (Table : matches)
  4. Entraînement · En une seule ligne, affiche le nombre de factures (nb_invoices), le nombre de factures impayées (unpaid) et le montant total encore dû (amount_due). Une facture impayée n'a pas de date de paiement. (Table : invoices)
  5. Défi · Affiche le titre de chaque film et le nom de son réalisateur, en affichant 'Unknown' quand il n'est pas connu. Tous les films doivent apparaître. (Tables : movies, directors)

Dans SpeedQL, chaque requête est corrigée tout de suite : le résultat est comparé à celui attendu, puis la requête est relancée sur une base de contrôle cachée. Chaque exercice a ses indices écrits, à afficher seulement si tu bloques.

Voir aussi : la fiche de l’aide-mémoire · les exercices SQL corrigés sur cette notion

Faire les exercices du niveau 12

Gratuit, sans inscription : la leçon et les 5 exercices s’ouvrent directement dans ton navigateur.

Ouvrir le niveau 12 dans SpeedQL

·