Dans cette leçon, on va encore mieux faire connaissance avec ce pote mystérieux qu'est NULL. Bien sûr, tes propres boulettes avec lui sont encore à venir, mais... prévenu = armé. On va décortiquer quelques erreurs classiques liées à NULL.
Erreur 1 : Utiliser l'opérateur classique = pour tester NULL
Franchement, c'est l'erreur la plus répandue chez les débutants SQL : essayer d'utiliser l'opérateur = pour vérifier si une valeur est NULL.
Qu'est-ce qui se passe ?
SELECT *
FROM students
WHERE age = NULL;
En pensant naïvement que ça va afficher tous les étudiants avec un âge indéfini, tu vas être déçu : cette requête ne renverra rien du tout. Pourquoi ? Parce que NULL n'est pas une valeur, donc les opérateurs de comparaison classiques ne marchent pas avec lui. Comme le dit le grimoire SQL : "NULL ne peut pas être comparé directement à quoi que ce soit".
Comment il faut faire ?
Pour vérifier si une valeur est NULL, utilise IS NULL :
SELECT *
FROM students
WHERE age IS NULL;
Maintenant tu récupères tous les étudiants dont l'âge n'est pas renseigné.
Erreur 2 : Les fonctions d'agrégation ignorent NULL (sauf COUNT(*))
Quand tu fais des requêtes avec des fonctions d'agrégation, NULL est automatiquement zappé des calculs. Ça peut donner des résultats chelous.
Qu'est-ce qui se passe ?
SELECT AVG(salary) AS avg_salary
FROM employees;
Si la colonne salary contient des NULL, ces lignes sont juste ignorées, et la moyenne sera calculée sans elles. Ça peut donner une fausse idée du salaire moyen.
Comment éviter ça ?
Avant d'agréger, assure-toi de remplacer correctement les NULL par une valeur par défaut. Par exemple, utilise COALESCE() :
SELECT AVG(COALESCE(salary, 0)) AS avg_salary
FROM employees;
Maintenant, les valeurs NULL seront remplacées par 0 avant le calcul.
Erreur 3 : Comparer NULL entre eux
Dans une base de données, NULL n'est égal à rien, même pas à un autre NULL. C'est surprenant, non ?
Qu'est-ce qui se passe ?
SELECT *
FROM students
WHERE NULL = NULL;
Cette requête renverra aussi un résultat vide. Pourquoi ? Parce que SQL considère que l'absence d'une valeur ne peut pas être "égale" à l'absence d'une autre. Ouais, SQL c'est un peu de la philo.
Comment il faut faire ?
Si tu veux tester si deux champs sont NULL, utilise des trucs comme IS NULL. Par exemple :
SELECT *
FROM students
WHERE first_name IS NULL AND last_name IS NULL;
Erreur 4 : Division par NULL
Diviser par NULL, c'est pas juste une erreur, c'est carrément un crime mathématique, et SQL te punit avec un résultat absurde : NULL.
Qu'est-ce qui se passe ?
SELECT 10 / NULL AS result;
Résultat ? NULL. SQL refuse même d'essayer de comprendre ce que tu veux.
Comment éviter ça ?
Pour éviter ce genre de galère, utilise COALESCE() ou NULLIF() :
SELECT 10 / COALESCE(divisor, 1) AS result
FROM calculations;
Dans cette requête, si divisor est NULL, au lieu de diviser par NULL tu divises par 1.
Erreur 5 : Les opérateurs logiques qui ne marchent pas avec NULL
NULL casse toute la logique dès qu'il se pointe dans une expression. Par exemple, la condition TRUE AND NULL renverra NULL, pas TRUE ni FALSE.
Qu'est-ce qui se passe ?
SELECT *
FROM students
WHERE age > 18 OR age = NULL;
Ici, même si age > 18 est vrai pour certaines lignes, celles avec NULL dans la colonne age peuvent être exclues du résultat. Pourquoi ? Parce que la partie age = NULL renverra NULL, pas TRUE.
Comment il faut faire ?
Pense toujours à gérer explicitement les valeurs NULL dans tes conditions logiques :
SELECT *
FROM students
WHERE age > 18 OR age IS NULL;
Erreur 6 : Comportement implicite lors du tri avec NULL (l'erreur la plus "lourde")
Si tu utilises ORDER BY dans ta requête, le comportement de NULL peut te surprendre. Par défaut, PostgreSQL met les lignes avec des NULL à la fin quand tu tries en ordre croissant, et au début en ordre décroissant.
Qu'est-ce qui se passe ?
SELECT product_name, price
FROM products
ORDER BY price;
Si price contient des NULL, ces lignes seront affichées à la fin de la liste.
Comment éviter les surprises ?
Tu peux préciser le tri pour NULL avec NULLS FIRST ou NULLS LAST :
SELECT product_name, price
FROM products
ORDER BY price NULLS FIRST;
Erreur 7 : Mauvaise gestion des clés étrangères et de NULL
Les valeurs NULL dans les colonnes de clés étrangères peuvent parfois donner des comportements inattendus.
Qu'est-ce qui se passe ?
Si tu as ajouté des clés étrangères à une table et que tu essaies d'insérer une ligne en laissant le champ de la clé étrangère vide, PostgreSQL ne dira rien. C'est parce que les valeurs NULL ne sont pas vérifiées dans les tables liées.
Comment bien faire ?
Utilise la contrainte NOT NULL si tu veux empêcher l'utilisation de NULL dans ces champs. Ou alors, retiens juste que les valeurs NULL restent des "orphelins", qui n'appartiennent à aucune des tables liées.
Tu en sauras plus sur les tables liées et les clés étrangères dans la prochaine leçon :P
GO TO FULL VERSION