En SQL, NULL n’est pas une valeur !

Je vois encore énormément d’erreurs à ce sujet, chez les développeurs avec qui je travaille et j’ai travaillé, mais aussi sur le forum.

Voici donc la démonstration que NULL en SQL n’est pas une valeur …


C’est très simple : exécutez la requête suivante :

1
2
3
IF NULL = NULL
  PRINT 'OK'
ELSE PRINT 'KO'

Vous pensez que l’on va obtenir OK … Donc vous pensez que NULL est une valeur et c’est faux : on obtiendra KO !
Vous pouvez faire l’expérience avec n’importe quel autre opérateur arithmétique (>, >=, <, <=, <>, !=) : vous obtiendrez toujours KO

Ceci prouve que NULL n’est pas une valeur : en SQL, c’est un marqueur qui signifie l’absence de valeur.
C’est d’ailleurs la raison pour laquelle en SQL, on écrit IS NULL dans un prédicat (WHERE ou JOIN), et non pas = NULL.
En revanche, dans un langage comme Java ou C#, null == null est effectivement vrai.

En effet, beaucoup de langages évaluent les expressions logiques suivant deux valeurs : true ou false.
Mais en SQL, un prédicat et évalué comme étant TRUE, FALSE ou UNKNOWN.

De la même façon, toute autre opération (NULL [operateur_arithmétique] [valeur]), peu importe le type de [valeur], retourne toujours NULL :

– NULL + 4
– NULL + ‘uneChaine’
– REPLACE(uneChaineNULL, ‘qqch’, ‘_qqch’)

Enfin, NULL est traité différemment par les différents opérateurs que l’implémentation SQL Server de SQL propose :

– Les filtres de requête (ON d’une jointure, WHERE (et AND qui suivent) et HAVING) évalueront NULL comme ne vérifiant pas le prédicat
РUne contrainte CHECK ̩valuera NULL comme v̩rifiant le pr̩dicat
– Une contrainte UNIQUE prend NULL comme une valeur, ce qui est totalement faux
– Une opération avec les opérateurs d’ensembles UNION, EXCEPT et INTERSECT traite NULL comme une valeur, ce qui est également faux
– GROUP BY groupe tous les NULL dans un groupe distinct
– ORDER BY trie le NULL ensemble
– La fonction COUNT() tient compte de NULL
– Les autres fonctions d’agrégation n’en tiennent pas compte

Attention à NULL ;)

ElSüket

Une réflexion au sujet de « En SQL, NULL n’est pas une valeur ! »

  1. Il faut noter que tout dépend de l’option SET ANSI_NULLS de la base de données.
    Si cette option est à OFF alors celà change tout !

    Exemple :

    1
    2
    3
    4
    5
    6
    <br />
    SET ANSI_NULLS OFF<br />
    <br />
    IF NULL = NULL <br />
      PRINT 'OK' <br />
    ELSE PRINT 'KO'<br />

    Donne bien comme résultat : OK

Laisser un commentaire