164
Chapitre 6 • SQL avancé
from
CLIENT C2
where C2.CAT > C1.CAT);
Ce résultat en apparence absurde est rigoureusement conforme aux règles d’interprétation de SQL. Considérons la ligne K729. Sa valeur de CAT étant null, la
condition C2.CAT > C1.CAT vaut unknown et l’ensemble entre parenthèses est
vide. Le prédicat not exists est évalué à true, et la ligne est retenue !
6.10.7 Deux recommandations
En raison des multiples difficultés qu’entraîne l’usage de la valeur null, certains
auteurs recommandent de les éviter purement et simplement 22 . Citons deux techniques qui permettent de les contourner si on l’estime nécessaire :
1. détachement des colonnes facultatives
La table est décomposée de manière à extraire toute colonne facultative (ou
groupe de colonnes simultanément facultatives) sous la forme d’une table
autonome. C’est ainsi que la table CLIENT pourrait être remplacée par les
deux tables suivantes qui ne comportent plus que des colonnes not null :
create table CLIENT (NCLI .. not null primary key,
NOM .. not null,
ADRESSE .. not null,
LOCALITE .. not null,
COMPTE .. not null);
create table CLICAT( NCLI .. not null primary key,
CAT char(2) not null,
foreign key (NCLI) reference CLIENT);
2. utilisation de valeurs par défaut
La colonne facultative est déclarée not null, mais est accompagnée d’une
valeur par défaut. La prise en compte de cette valeur est à charge de
l’utilisateur.
create table CLIENT (NCLI .. not null primary key,
NOM .. not null,
ADRESSE .. not null,
LOCALITE .. not null,
CAT char(2) default 'A0' not null,
COMPTE .. not null);
NCLI
CAT
K729
D063
F400


C2
22. Citons par exemple les références [Codd, 1989], [Date, 1992], et [Date, 1997], auxquelles
nous avons emprunté certains exemples de cette section.
Précédent

- 164/436

Suivant