Retour à la liste des articles Articles
6 minutes de lecture

Comprendre l'utilisation de NULL en SQL Logique à trois valeurs

Les NULL sont nécessaires dans les bases de données relationnelles, et apprendre à les utiliser est fondamental pour réussir en SQL. Cependant, les NULL doivent également être manipulés avec précaution, comme nous l'expliquons dans cet article.

Dans les bases de données relationnelles, nous n'avons pas toujours une valeur à mettre dans une colonne. Par exemple, supposons que nous ayons une table appelée "persons" qui possède les colonnes "first_name", "last_name", "birth_date" et "marriage_date". Quelle valeur allons-nous stocker dans la colonne "date_de_mariage" pour les personnes célibataires ? Dans ce cas, la colonne ne pourrait pas avoir de valeur car les célibataires ne sont pas mariés. Nous avons besoin d'un moyen d'indiquer que nous n'avons pas de valeur pour cette colonne. Heureusement, nous disposons d'une telle chose : la valeur NULL, qui est largement utilisée dans les bases de données relationnelles.

Les valeurs NULL peuvent être appliquées à n'importe quel type de données : entiers, dates, VARCHAR ou tout autre type de colonne. Mais nous devons faire attention lorsque nous créons des calculs ou des expressions contenant un ou plusieurs opérateurs avec une valeur NULL. Nous allons voir pourquoi.

Les NULL et la logique à trois valeurs

La raison pour laquelle les NULL peuvent parfois faire trébucher les gens est liée à ce que l'on appelle la logique à trois valeurs. Alors que la logique binaire ou booléenne possède deux valeurs ("vrai" et "faux"), la logique à trois valeurs (abrégée en 3VL et également connue sous le nom de logique ternaire) possède une valeur supplémentaire, "inconnu".

Illustrons 3VL à l'aide d'un scénario simple. Supposons que nous voulions obtenir les noms des employés qui gagnent plus de 1 200 € par mois. La table employee tableau ressemble à ceci :

First Name Last Name Salary Bonus
John Smith 1000 500
Mary Smith 1000 1500
Peter White 1800 NULL
Nick Perry 1000 NULL

Nous essayons la requête suivante :

SELECT * FROM employee WHERE bonus + salary > 1200;

Le résultat est :

First Name Last Name Salary Bonus
John Smith 1000 500
Mary Smith 1000 1500

Nous devrions voir trois enregistrements dans le jeu de résultats, mais il n'y en a que deux. Pourquoi Peter White n'est-il pas inclus ? La raison est liée à la valeur NULL dans la colonne bonus. En SQL, toute opération arithmétique qui inclut un opérande avec une valeur NULL renvoie un résultat NULL.

Donc, en gardant cela à l'esprit, regardez comment l'enregistrement de Peter White a été évalué :

1800 + NULL > 1200

En d'autres termes, le salaire de Peter (1 800) et sa prime (NULL) s'additionnent pour donner NULL. Nous pouvons réduire cette condition à :

NULL > 1200

NULL est-il donc supérieur à 1 200 ? Rappelez-vous que NULL représente une valeur inexistante, ce qui signifie que nous n'avons rien à comparer à 1 200 : nous ne pouvons pas savoir si cette affirmation est vraie ou fausse. C'est ainsi que fonctionne la logique à trois valeurs. Lorsque nous avons une valeur NULL dans une condition, le résultat de cette condition sera "inconnu".

Maîtriser la logique à trois valeurs dans les requêtes SQL

Pour comprendre le fonctionnement de la logique à trois valeurs, examinons le processus étape par étape. Tout d'abord, réfléchissez à la manière dont les enregistrements sont filtrés dans la clause WHERE. Seuls les enregistrements qui obtiennent la valeur "true" dans la clause WHERE font partie du jeu de résultats de la requête. Les enregistrements qui obtiennent la valeur "false" ou "unknown" ne font pas partie du résultat. C'est pourquoi l'enregistrement de Peter White n'a pas été pris en compte dans les résultats de la requête précédente. Son salaire total est évalué à "Inconnu" dans la clause WHERE ; "1800 + NULL > 1200" est "Inconnu" car nous ne pouvons pas savoir ce qu'est NULL.

Les tables AND, OR et NOT sont également importantes dans la logique à trois valeurs. Nous allons donc les examiner individuellement et voir comment elles sont calculées. Commençons par la table NOT :

Value NOT Result
True False
False True
Unknown Unknown

Ensuite, voyons la table ET :

AND True False Unknown
True True False Unknown
False False False False
Unknown Unknown False Unknown

Analysons pourquoi "faux" ET "inconnu" équivaut à "faux". Un seul "faux" suffit à rendre l'ensemble du résultat "faux" dans une opération ET. Cela est vrai, que la deuxième valeur soit "vraie", "fausse" ou "inconnue".

Enfin, nous avons le tableau OR :

OR True False Unknown
True True True True
False True False Unknown
Unknown True Unknown Unknown

Essayons une requête qui utilise l'opérateur OR :

SELECT * FROM employee WHERE salary < 1500 OR bonus > 200 

Le résultat est le suivant :

First Name Last Name Salary Bonus
John Smith 1000 500
Mary Smith 1000 1500
Nick Perry 1000 NULL

Remarquez qu'un enregistrement contenant une valeur NULL dans la colonne "bonus" est affiché dans le résultat, mais que l'autre enregistrement NULL ne l'est pas. La raison en est l'opérateur OR. Puisque la condition salaire < 1500 est vraie, il n'est pas nécessaire d'évaluer la condition bonus > 200.

Faire face à une variable inconnue

Vous pouvez parfois éviter d'utiliser des valeurs " inconnues " dans les conditions WHERE en convertissant les valeurs NULL en d'autres valeurs (comme 0) à l'aide de la fonction COALESCE(). Considérez les exemples précédents. Si vous deviez convertir chaque NULL en "0" avant de comparer la valeur dans le WHERE, vous obtiendriez des résultats différents de ceux présentés ci-dessus. Toutefois, cette conversion peut être possible ou non, selon la sémantique de la requête. Néanmoins, essayons et voyons ce qui se passe.

SELECT * FROM employee WHERE coalesce(bonus,0) > 200 OR salary < 1500

La requête ne génère que des résultats "vrais" ou "faux". Dans ce cas, la logique à deux valeurs sera appliquée.

Supposons que nous recevions un ordre d'accorder une augmentation de salaire de 5 % aux employés gagnant moins de 1 600 € par mois. Comment devons-nous écrire cette requête ? Faisons un essai :

UPDATE employee
SET salary = salary *1.05
WHERE salary + bonus <= 1600

Voici les résultats :

First Name Last Name Salary Bonus
John Smith 1050 500
Mary Smith 1000 1500
Peter White 1800 NULL
Nick Perry 1000 NULL

Attendez une minute - le salaire de Nick n'a pas changé ! Ce n'est pas juste ! Encore une fois, le résultat "inconnu" de la condition "salaire + bonus <= 1600" pour l'enregistrement de Nick cause un problème.

Notre deuxième essai est meilleur :

UPDATE employee
SET salary = salary *1.05
WHERE salary + coalesce(bonus,0) <= 1600

Comme nous pouvons le voir dans le résultat de la requête suivante, le salaire des deux enregistrements (Jean et Nick) a été modifié.

First Name Last Name Salary Bonus
John Smith 1050 500
Mary Smith 1000 1500
Peter White 1800 NULL
Nick Perry 1050 NULL

Essayez vous-même !

Il peut y avoir de nombreuses clauses WHERE différentes qui donnent la valeur "inconnu" ou "faux". Pourquoi ne pas essayer vous-même quelques requêtes SQL et voir lesquelles renvoient des valeurs "vraies", "fausses" ou "inconnues" ? LearnSQL.fr peut vous apprendre tout sur la clause WHERE et ses conditions. Essayez-le gratuitement !