88
Chapitre 5 • Le langage SQL DML
d) Conditions d’association quantifiées
Il est intéressant de sélectionner les lignes d’une table qui sont associées, non pas à
au moins une des lignes d’une autre table qui vérifient une certaine condition, mais
bien à un nombre défini de ces lignes. La requête suivante recherche les commandes
d’au moins 3 détails.
select NCOM, DATECOM, NCLI
from
COMMANDE C
where (select count(*)
from DETAIL
where NCOM = C.NCOM) >= 3
e) Null = null ?
C’est l’occasion d’examiner d’un peu plus près les moeurs sociales de la valeur
null. De manière assez surprenante, la requête :
select NCLI from CLIENT
where CAT in ( select CAT
from
CLIENT
where NCLI = 'D063')
. . . renvoie une réponse vide, alors que celle-ci devrait au moins contenir la référence D063 ! La raison en est très simple : la valeur de CAT du client D063 est
null, or null n’est en principe comparable à rien, même pas à lui-même 19 ,
puisqu’il est généralement interprété comme inconnu. Nous rediscuterons de cette
question plus tard (section 6.10).
5.3.5 Les quantificateurs ensemblistes
a) Les formes de base
Une condition peut porter sur l’existence (exists) ou l’inexistence (not exists)
d’au moins une ligne dans le résultat d’une sous-requête, ou, en d’autres termes, sur
le fait que le résultat d’une sous-requête est non vide ou vide.
La requête suivante recherche les produits qui ne sont pas commandés pour
l’instant, c’est-à-dire ceux pour lesquels il n’existe aucune ligne de DETAIL 20 . La
sous-requête désigne, pour chaque ligne P de PRODUIT, l’ensemble des lignes de
DETAIL qui y font référence, c’est-à-dire dont NPRO est égal à NPRO de P.
select NPRO, LIBELLE
from
PRODUIT as P
where not exists ( select *
from
DETAIL
where NPRO = P.NPRO)
19. Il y a malheureusement des exceptions (group by par exemple).
20. Il existe une autre formulation de cette requête qui utilise la relation de comparaison not
in. Laquelle ?
Chapitre 5 • Le langage SQL DML
d) Conditions d’association quantifiées
Il est intéressant de sélectionner les lignes d’une table qui sont associées, non pas à
au moins une des lignes d’une autre table qui vérifient une certaine condition, mais
bien à un nombre défini de ces lignes. La requête suivante recherche les commandes
d’au moins 3 détails.
select NCOM, DATECOM, NCLI
from
COMMANDE C
where (select count(*)
from DETAIL
where NCOM = C.NCOM) >= 3
e) Null = null ?
C’est l’occasion d’examiner d’un peu plus près les moeurs sociales de la valeur
null. De manière assez surprenante, la requête :
select NCLI from CLIENT
where CAT in ( select CAT
from
CLIENT
where NCLI = 'D063')
. . . renvoie une réponse vide, alors que celle-ci devrait au moins contenir la référence D063 ! La raison en est très simple : la valeur de CAT du client D063 est
null, or null n’est en principe comparable à rien, même pas à lui-même 19 ,
puisqu’il est généralement interprété comme inconnu. Nous rediscuterons de cette
question plus tard (section 6.10).
5.3.5 Les quantificateurs ensemblistes
a) Les formes de base
Une condition peut porter sur l’existence (exists) ou l’inexistence (not exists)
d’au moins une ligne dans le résultat d’une sous-requête, ou, en d’autres termes, sur
le fait que le résultat d’une sous-requête est non vide ou vide.
La requête suivante recherche les produits qui ne sont pas commandés pour
l’instant, c’est-à-dire ceux pour lesquels il n’existe aucune ligne de DETAIL 20 . La
sous-requête désigne, pour chaque ligne P de PRODUIT, l’ensemble des lignes de
DETAIL qui y font référence, c’est-à-dire dont NPRO est égal à NPRO de P.
select NPRO, LIBELLE
from
PRODUIT as P
where not exists ( select *
from
DETAIL
where NPRO = P.NPRO)
19. Il y a malheureusement des exceptions (group by par exemple).
20. Il existe une autre formulation de cette requête qui utilise la relation de comparaison not
in. Laquelle ?
