6.10 SQL et l’information incomplète
163
© Dunod – La photocopie non autorisée est un délit.
e) Fonction agrégative sur un ensemble vide
La règle qui stipule que la fonction sum renvoie null pour un ensemble vide est
parfois contraire à l’intuition, notamment dans le domaine numérique. Ainsi, la
somme des montants des commandes des clients qui n’ont pas de commandes vaudra
null et non 0. Si cette somme est retirée de COMPTE, la valeur de cette dernière
colonne sera détruite chez les clients qui n’ont pas commandé, ce qui exige de traiter
séparément ce cas particulier, comme on l’a montré à la section 5.8.3.
f) Les valeurs null sont timides : elles disparaissent dès qu’on s’y intéresse
Il n’est pas nécessaire d’étudier des requêtes très complexes pour rencontrer des
problèmes d’interprétation. La requête suivante donne un résultat sans surprise :
select CAT from CLIENT where LOCALITE = 'Toulouse'
Si nous voulions éliminer les valeurs de CAT se terminant par 1, nous serions tentés
d’écrire :
select CAT from CLIENT where LOCALITE = 'Toulouse'
and
CAT not like '_1';
... faisant ainsi disparaître des lignes qui ne semblaient pas concernées par la condition supplémentaire. Cette disparition des valeurs null est aisée à expliquer : lors
de l’évaluation de la condition CAT not like '_1' elles rendent celle-ci unknown
par leur simple présence et donc disparaissent.
g) En revanche, on en trouve là où on ne les attend pas
Nous donnerons encore un exemple d’interprétation particulièrement problématique
du prédicat exists en présence de valeurs null. Recherchons les clients dont la
catégorie est la plus élevée. On décide de formuler la requête comme suit : on
recherche les clients pour lesquels il n’existe pas de clients dont la catégorie soit
supérieure. Il vient :
select NCLI,CAT
from
CLIENT C1
where not exists (select *
CAT
B1
B1
B2
CAT
B2
163
© Dunod – La photocopie non autorisée est un délit.
e) Fonction agrégative sur un ensemble vide
La règle qui stipule que la fonction sum renvoie null pour un ensemble vide est
parfois contraire à l’intuition, notamment dans le domaine numérique. Ainsi, la
somme des montants des commandes des clients qui n’ont pas de commandes vaudra
null et non 0. Si cette somme est retirée de COMPTE, la valeur de cette dernière
colonne sera détruite chez les clients qui n’ont pas commandé, ce qui exige de traiter
séparément ce cas particulier, comme on l’a montré à la section 5.8.3.
f) Les valeurs null sont timides : elles disparaissent dès qu’on s’y intéresse
Il n’est pas nécessaire d’étudier des requêtes très complexes pour rencontrer des
problèmes d’interprétation. La requête suivante donne un résultat sans surprise :
select CAT from CLIENT where LOCALITE = 'Toulouse'
Si nous voulions éliminer les valeurs de CAT se terminant par 1, nous serions tentés
d’écrire :
select CAT from CLIENT where LOCALITE = 'Toulouse'
and
CAT not like '_1';
... faisant ainsi disparaître des lignes qui ne semblaient pas concernées par la condition supplémentaire. Cette disparition des valeurs null est aisée à expliquer : lors
de l’évaluation de la condition CAT not like '_1' elles rendent celle-ci unknown
par leur simple présence et donc disparaissent.
g) En revanche, on en trouve là où on ne les attend pas
Nous donnerons encore un exemple d’interprétation particulièrement problématique
du prédicat exists en présence de valeurs null. Recherchons les clients dont la
catégorie est la plus élevée. On décide de formuler la requête comme suit : on
recherche les clients pour lesquels il n’existe pas de clients dont la catégorie soit
supérieure. Il vient :
select NCLI,CAT
from
CLIENT C1
where not exists (select *
CAT
B1
B1
B2
CAT
B2
