138
Chapitre 6 • SQL avancé
and
D.NCOM = M.NCOM) as MONTANT
from
COMMANDE M
where MONTANT > 1000
6.3.2 Extension de la clause from
D’une manière générale, la clause from permet de mentionner les tables desquelles
des données élémentaires ou calculées sont extraites (clause select). Jusqu’ici, on
n’y mentionnait que le nom de tables de base ou de vues. Il est cependant possible
d’y spécifier des tables dérivées, résultant d’opérateurs produisant des tables. Nous
en examinerons trois : les opérateurs ensemblistes, la requête SFW elle-même et les
opérateurs de jointure.
a) Les expressions ensemblistes
Toute expression consistant en une union, une intersection ou une différence de
tables, qu’elles soient de base ou dérivées, peut être utilisée dans la clause from.
Les règles de formation de telles expressions sont celles qui ont été brièvement
décrites en 5.4.4. Considérant les tables BON_CLIENT (décrivant un sous-ensemble
des clients) et PROSPECT (reprenant les clients potentiels), de même schéma que
CLIENT, on pourra écrire 5 :
select NCLI, NOM
from ((select NCLI, NOM, LOCALITE from CLIENT)
except
(select NCLI, NOM, LOCALITE from BON_CLIENT)
union
(select NCLI, NOM, LOCALITE from PROSPECT))
where LOCALITE = ’Poitiers’
b) Les requêtes SFW
Rappelons que l’évaluation d’une requête SFW a pour résultat une table d’une ou
plusieurs colonnes, éventuellement vide. Il est permis d’utiliser cette table comme
source de lignes pour une autre requête SFW sans qu’il soit nécessaire de stocker la
table intermédiaire par un "insert into" 6 . La requête suivante calcule la moyenne
des montants des commandes 7 :
select avg(MONTANT)
from (select NCOM, sum(QCOM*PRIX) as MONTANT
from
DETAIL D, PRODUIT P
where D.NPRO = P.NPRO
group by NCOM)
5. La forme intuitive from CLIENT except BON_CLIENT ... n’est pas valide. Cependant la
forme équivalente from table CLIENT except table BON_CLIENT ... est autorisée.
6. La section 6.2.6 propose une autre technique, basée sur la définition d’une vue intermédiaire.
7. On ne peut pas écrire : avg(sum(QCOM*PRIX)).
Précédent

- 138/436

Suivant