Livre_silo 30 août 2013 16:32 Page 292
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
292
Informatique pour tous
On peut ensuite l’imbriquer dans une autre requête, mais ceci se révèle vite malcommode, surtout dans
ce cas où le résultat de cette requête doit être utilisé deux fois (une fois pour déterminer le maximum,
une autre fois pour retrouver la classe correspondante).
En pratique, on préfère stocker les résultats des requêtes intermédiaires dans des tables temporaires au
moyen de la commande CREATE VIEW pour leur appliquer les requêtes suivantes, mais cela dépasse le
cadre de cet ouvrage.
11.3.3 Agrégation
Pour calculer A1,...,An γ f1(B1),...,fm(Bm) on écrit :
SELECT A1, ..., An, f1(B1), ..., fm(Bm) FROM R GROUP BY A1, ..., An;
On remarque qu’il est également possible de coupler ce calcul à une projection pour ajouter
d’autres attributs.
Pour effectuer une sélection en amont il faut utiliser une condition WHERE avant l’instruction GROUP BY.
Pour réaliser une sélection en aval, il faut utiliser une syntaxe spécifique de condition en
utilisant l’instruction HAVING après l’instruction GROUP BY.
Ainsi l’expression :
(σ P2 ◦ A1,··· ,An γ f1(B1),...,fm(Bm) ◦ σ P1 )(R)
se traduit par la requête :
SELECT A1, ..., An, f1(B1), ..., fm(Bm) FROM R WHERE P1 GROUP BY A1, ..., An HAVING P2;
SAVOIR-FAIRE Choisir entre une sélection en amont (WHERE)
et une sélection en aval (HAVING)
Dans la mesure du possible, il faut toujours réaliser les sélections en amont, car cela
limite le nombre de valeurs à considérer dans l’agrégation.
Cependant, lorsque l’on désire sélectionner en fonction du résultat des fonctions
d’agrégation, il est obligatoire de le faire en aval à l’aide d’une instruction HAVING.
Exercice 11.8 Traduire en langage SQL les requêtes écrites à l’exercice 11.4.
1
SELECT filiere, avg(note) FROM releve GROUP BY filiere;
2
SELECT filiere, numero, avg(note) FROM releve GROUP BY filiere, numero;
3
SELECT filiere, numero, avg(note) FROM releve WHERE numero = 2, GROUP BY filiere, numero;
4
SELECT filiere, numero, avg(note) FROM releve
GROUP BY filiere, numero HAVING avg(note) >= 12;
Précédent

- 305/402

Suivant