6.10 SQL et l’information incomplète
161
© Dunod – La photocopie non autorisée est un délit.
NUMAGREATION char(12) unique;
Dans certains SGBD, cette contrainte d’unicité porte également sur les valeurs
null. Il est donc possible d’insérer une ligne sans valeur pour cette nouvelle
colonne, mais pas deux ! La définition d’un unique index est sans espoir : le
comportement sera identique 21 . Conclusion, ici encore, null = null.
c) Null est-il plus grand que 'C2' ?
La valeur null n’est pas comparable aux autres valeurs et est donc exclue de toute
relation d’ordre. Cependant, la requête suivante donne une liste ordonnée dans
laquelle null apparaît en bonne place (sa position dépend du SGBD) :
select distinct CAT from CLIENT order by CAT;
On pourrait donc légitimement penser que le prédicat (CAT < X) est évalué à true
au lieu de unknown lorsque X = null et que CAT n’est pas null. Il n’en est rien.
Dans le même (dés)ordre d’idées, le prédicat suivant vaut unknown et non true
lorsque l’expression CAT vaut null :
(CAT < 'C1') or (CAT = 'C1') or (CAT > 'C1')
d) Sommes et valeurs null
En présence de valeurs null, la somme n’est pas distributive. Autrement dit,
sum(A + B) n’est pas nécessairement égal à sum(A) + sum(B).
Considérons la table ACTIVITE comportant les deux colonnes facultatives
H_COURS et H_TP, représentant le nombre d’heures de cours et de travaux pratiques consacrées à chaque activité. On convient de représenter l’absence de cours
par H_COURS = null, et de même pour l’absence de TP (figure 6.3).
21. A ces interprétations subtilement divergentes, certains SGBD ajoutent leur grain de sel. Par
exemple, Oracle 7 assimile une chaîne de caractères vide à l’absence de valeur (null). Cette
erreur a été corrigée dans les versions ultérieures.
Au lecteur perplexe quant à la subtile différence entre ces deux situations, on fera observer que,
par exemple, la fonction len, qui donne le nombre de caractères d’une valeur, donnera 0 dans le
cas d’une chaîne vide et null dans le cas d’une valeur absente.
CAT
B1
B2
C1
C2
161
© Dunod – La photocopie non autorisée est un délit.
NUMAGREATION char(12) unique;
Dans certains SGBD, cette contrainte d’unicité porte également sur les valeurs
null. Il est donc possible d’insérer une ligne sans valeur pour cette nouvelle
colonne, mais pas deux ! La définition d’un unique index est sans espoir : le
comportement sera identique 21 . Conclusion, ici encore, null = null.
c) Null est-il plus grand que 'C2' ?
La valeur null n’est pas comparable aux autres valeurs et est donc exclue de toute
relation d’ordre. Cependant, la requête suivante donne une liste ordonnée dans
laquelle null apparaît en bonne place (sa position dépend du SGBD) :
select distinct CAT from CLIENT order by CAT;
On pourrait donc légitimement penser que le prédicat (CAT < X) est évalué à true
au lieu de unknown lorsque X = null et que CAT n’est pas null. Il n’en est rien.
Dans le même (dés)ordre d’idées, le prédicat suivant vaut unknown et non true
lorsque l’expression CAT vaut null :
(CAT < 'C1') or (CAT = 'C1') or (CAT > 'C1')
d) Sommes et valeurs null
En présence de valeurs null, la somme n’est pas distributive. Autrement dit,
sum(A + B) n’est pas nécessairement égal à sum(A) + sum(B).
Considérons la table ACTIVITE comportant les deux colonnes facultatives
H_COURS et H_TP, représentant le nombre d’heures de cours et de travaux pratiques consacrées à chaque activité. On convient de représenter l’absence de cours
par H_COURS = null, et de même pour l’absence de TP (figure 6.3).
21. A ces interprétations subtilement divergentes, certains SGBD ajoutent leur grain de sel. Par
exemple, Oracle 7 assimile une chaîne de caractères vide à l’absence de valeur (null). Cette
erreur a été corrigée dans les versions ultérieures.
Au lecteur perplexe quant à la subtile différence entre ces deux situations, on fera observer que,
par exemple, la fonction len, qui donne le nombre de caractères d’une valeur, donnera 0 dans le
cas d’une chaîne vide et null dans le cas d’une valeur absente.
CAT
B1
B2
C1
C2
