90
Chapitre 5 • Le langage SQL DML
c) Condition de totalité (pour tout)
Parmi les classes de conditions d’association vues jusqu’ici, il en est une que nous
n’avons pas abordée : puisque SQL propose le quantificateur existentiel exists
(concrétisation du quantificateur ∃), il devrait aussi proposer le quantificateur
universel for all (analogue à ∀). Ce dernier n’est cependant pas proposé, de sorte
qu’il nous faudra tourner ce type de condition d’une autre manière.
Recherchons par exemple les commandes qui spécifient tous les produits. Considérons une (ligne de) COMMANDE M. Celle-ci est sélectionnée si les PRODUITs
commandés par M et les PRODUITs forment deux ensembles identiques, c’est-àdire que le second ensemble est inclus dans le premier 21 . Ou encore, M est retenue si,
pour tout PRODUIT P, P est dans l’ensemble des PRODUIT commandés par M. Le
quantificateur pour tout n’existant pas, nous allons appliquer l’équivalence suivante,
qui permet de se passer du quantificateur ∀ :
(∀x, P(x)) ≡ ¬(∃x, ¬P(x))
Il vient :
la COMMANDE M est retenue s’il n’existe pas de PRODUIT P, tel que P n’est pas
dans l’ensemble des PRODUITs commandés par M.
La traduction mot-à-mot de cette formule en SQL ne pose pas de problèmes insurmontables :
En rassemblant ces fragments, on obtient (l’alias P, désormais inutile, pourrait être
ignoré) :
select NCOM
from
COMMANDE M
where not exists (select *
from
PRODUIT P
where P.NPRO not in (select NPRO
from
DETAIL
where NCOM = M.NCOM))
La sous-requête interne extrait les produits référencés par la commande courante M;
la sous-requête intermédiaire définit l’ensemble des produits que M ne référence pas;
21. Sachant que le premier est forcément inclus dans le second.
la COMMANDE M est retenue
→
si,
→
il n’existe pas
→
de PRODUIT P,
→
tel que
→
P n’est pas dans
→
l’ensemble des PRODUITs →
commandés par M.
→
select NCOM from COMMANDE M
where
not exists
(select * from PRODUIT P
where
P.NPRO not in
(select NPRO from DETAIL
where NCOM = M.NCOM))
Chapitre 5 • Le langage SQL DML
c) Condition de totalité (pour tout)
Parmi les classes de conditions d’association vues jusqu’ici, il en est une que nous
n’avons pas abordée : puisque SQL propose le quantificateur existentiel exists
(concrétisation du quantificateur ∃), il devrait aussi proposer le quantificateur
universel for all (analogue à ∀). Ce dernier n’est cependant pas proposé, de sorte
qu’il nous faudra tourner ce type de condition d’une autre manière.
Recherchons par exemple les commandes qui spécifient tous les produits. Considérons une (ligne de) COMMANDE M. Celle-ci est sélectionnée si les PRODUITs
commandés par M et les PRODUITs forment deux ensembles identiques, c’est-àdire que le second ensemble est inclus dans le premier 21 . Ou encore, M est retenue si,
pour tout PRODUIT P, P est dans l’ensemble des PRODUIT commandés par M. Le
quantificateur pour tout n’existant pas, nous allons appliquer l’équivalence suivante,
qui permet de se passer du quantificateur ∀ :
(∀x, P(x)) ≡ ¬(∃x, ¬P(x))
Il vient :
la COMMANDE M est retenue s’il n’existe pas de PRODUIT P, tel que P n’est pas
dans l’ensemble des PRODUITs commandés par M.
La traduction mot-à-mot de cette formule en SQL ne pose pas de problèmes insurmontables :
En rassemblant ces fragments, on obtient (l’alias P, désormais inutile, pourrait être
ignoré) :
select NCOM
from
COMMANDE M
where not exists (select *
from
PRODUIT P
where P.NPRO not in (select NPRO
from
DETAIL
where NCOM = M.NCOM))
La sous-requête interne extrait les produits référencés par la commande courante M;
la sous-requête intermédiaire définit l’ensemble des produits que M ne référence pas;
21. Sachant que le premier est forcément inclus dans le second.
la COMMANDE M est retenue
→
si,
→
il n’existe pas
→
de PRODUIT P,
→
tel que
→
P n’est pas dans
→
l’ensemble des PRODUITs →
commandés par M.
→
select NCOM from COMMANDE M
where
not exists
(select * from PRODUIT P
where
P.NPRO not in
(select NPRO from DETAIL
where NCOM = M.NCOM))
