CodeGym /Cours /SQL SELF /Travailler avec les valeurs NULL lors de la...

Travailler avec les valeurs NULL lors de la jointure de données

SQL SELF
Niveau 12 , Leçon 0
Disponible

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 ?

  1. Remplacer NULL par des valeurs plus parlantes avec COALESCE()

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 ?

  1. 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.

  1. Compter en tenant compte des NULL : exemple avec COUNT

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;
  1. 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.

  1. Utilise INNER JOIN si tu es sûr qu'il n'y a pas de NULL

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.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION