Imagine que tu fais une jointure entre deux tables : students (étudiants) et enrollments (inscriptions aux cours). Si dans la table enrollments il n'y a pas d'info sur un étudiant, mais que tu utilises par exemple un LEFT JOIN, les lignes de la table students vont quand même apparaître, mais les infos de enrollments seront absentes. À la place des données concrètes, tu verras alors des NULL.
Voilà à quoi ça ressemble :
Table students :
| id | name |
|---|---|
| 1 | Eva |
| 2 | Peter |
| 3 | Anna |
Table enrollments :
| student_id | course_name |
|---|---|
| 1 | Mathématiques |
| 1 | Informatique |
| 2 | Physique |
Requête avec LEFT JOIN :
SELECT students.id, students.name, enrollments.course_name
FROM students
LEFT JOIN enrollments ON students.id = enrollments.student_id;
Résultat :
| id | name | course_name |
|---|---|---|
| 1 | Eva | Mathématiques |
| 1 | Eva | Informatique |
| 2 | Peter | Physique |
| 3 | Anna | NULL |
Eh bien, salut NULL ! Comme tu vois, pour Anna qui n'est inscrite à aucun cours, l'info sur le cours est absente, donc c'est NULL qui s'affiche à la place.
Comment NULL influence les requêtes ?
NULL — ce n'est ni "zéro" ni "chaîne vide", c'est l'absence de valeur. Ce comportement a quelques conséquences marrantes (et parfois reloues) :
Comparaisons avec NULL :
Si tu écris un truc du genre WHERE course_name = NULL, la requête ne retournera pas les lignes où NULL est présent. Pourquoi ? Parce qu'on ne peut pas comparer directement des valeurs avec NULL.
Pour vérifier si c'est NULL, il faut utiliser des opérateurs spéciaux :
WHERE course_name IS NULL
Opérations mathématiques :
Toute opération avec NULL retourne NULL. Par exemple :
SELECT 5 + NULL; -- résultat : NULL
Fonctions d'agrégation :
La plupart des fonctions d'agrégation comme SUM(), AVG() ignorent les NULL, mais COUNT(*) compte toutes les lignes, même celles avec NULL.
Comment gérer les NULL ?
- Remplacer
NULLpar des valeurs plus parlantes avecCOALESCE()
La fonction COALESCE() te permet de remplacer NULL par une autre valeur. Par exemple, si un cours est absent, tu peux afficher "Pas de cours" :
SELECT
students.id,
students.name,
COALESCE(enrollments.course_name, 'Pas de cours') AS course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id;
Résultat :
| id | name | course_name |
|---|---|---|
| 1 | Eva | Mathématiques |
| 1 | Eva | Informatique |
| 2 | Peter | Physique |
| 3 | Anna | Pas de cours |
Ça rend tout de suite mieux, non ?
- Filtrer les valeurs
NULL
Si tu veux pas voir les lignes avec NULL, tu peux utiliser la condition WHERE ... IS NOT NULL. Par exemple :
SELECT
students.id,
students.name,
enrollments.course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id
WHERE
enrollments.course_name IS NOT NULL;
Résultat :
| id | name | course_name |
|---|---|---|
| 1 | Eva | Mathématiques |
| 1 | Eva | Informatique |
| 2 | Peter | Physique |
Anna disparaît du résultat, vu qu'elle n'a aucune inscription à un cours.
- Compter en tenant compte des
NULL: exemple avecCOUNT
Comme on l'a dit plus haut, certaines fonctions ignorent les NULL, d'autres non. Par exemple :
Pour compter toutes les lignes, même celles où il y a NULL :
SELECT COUNT(*) FROM students; -- Compte TOUTES les lignes (même celles où `course_name` = NULL)
Pour compter seulement les lignes où il n'y a pas de NULL :
SELECT COUNT(course_name) FROM enrollments;
- Expressions conditionnelles avec
CASE
Si t'aimes pas COALESCE() ou que tu veux plus de flexibilité, essaye CASE. Par exemple :
SELECT
students.id,
students.name,
CASE
WHEN enrollments.course_name IS NULL THEN 'Pas de cours'
ELSE enrollments.course_name
END AS course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id;
Le résultat sera le même qu'avec COALESCE(), mais CASE te permet de faire des trucs plus complexes.
- Utilise
INNER JOINsi tu es sûr qu'il n'y a pas deNULL
La méthode la plus radicale pour éviter les NULL : ne pas les laisser apparaître du tout, en utilisant INNER JOIN. Ce type de jointure ne retourne que les lignes qui matchent dans les deux tables :
SELECT
students.id,
students.name,
enrollments.course_name
FROM
students INNER JOIN enrollments
ON students.id = enrollments.student_id;
Pas de surprise — que les étudiants inscrits à des cours.
Résultat :
| id | name | course_name |
|---|---|---|
| 1 | Eva | Mathématiques |
| 1 | Eva | Informatique |
| 2 | Peter | Physique |
Si tes données doivent afficher toutes les valeurs, y compris les NULL, INNER JOIN ne sera pas adapté, mais parfois c'est tout ce qu'il faut.
GO TO FULL VERSION