* CINQ AGREGATS - FONCTIONS PREDEFINIS
Count, Sum, Avg, Min, Max
* PRINCIPE
- une fonction s'applique à l'ensemble des valeurs d'une colonne d'une relation
- elle produit une valeur unique
* CAS PARTICULIER
-> la fonction Count(*) compte les tuples d'une relation
"Donner le nombre de tuples de VINS"
SELECT Count (*)
FROM VINS
1) "Donner la moyenne des degrés de tous les vins"
SELECT Avg(DEG)
FROM VINS
2) "Donner la quantité totale commandée par le buveur Bac"
SELECT Sum (QTE)
FROM COMMANDES, BUVEURS
WHERE BUVEURS.NOM= 'Bac' AND BUVEURS.NB=COMMANDES.NB
Attention à ne pas mélanger dans un SELECT un agrégat avec
un attribut classique (par exemple SUM(QTE) avec NOM dans l'exemple
précédent). Un agrégat renvoie un résultat unique
alors qu'un attribut renvoie un ensemble de résultat. Le seul cas
possible d'utilisation d'un tel mélange est lorsqu'il y a une clause
GROUP BY.
On ne peut utiliser un agrégat directement dans une clause WHERE. Par
contre, il peut apparaitre dans la clause SELECT d'une sous-requête et
donc appartenir (un peu) à une clause WHERE.
1) "Donner les vins dont le degré est supérieur à la moyenne des degré de tous les vins"
SELECT *
FROM VINS
WHERE DEG > (SELECT Avg (DEG) FROM VINS)
2) "Donner les numéros de commande où la quantité
commandée a été totalement expédiée"
FROM COMMANDES C
WHERE C.QTE =
( SELECT Sum (E.QTE)
FROM EXPEDITIONS E
WHERE E.NC = C.NC
)
SELECT C.NC
![]()
Attention cette requête n'est pas aussi simple qu'elle en a l'air! En
effet, si on regarde de plus près, on s'aperçoit que la
sous-requête portant sur EXPEDITIONS utilise dans sa clause WHERE la
variable n-uplet C qui est définie dans la requête externe portant
sur COMMANDES. La requête externe revient à faire une boucle sur
la relation COMMANDES avec la variable C qui prend successivement chaque valeur
de COMMANDES et la requête interne traite chaque valeur de C.
Comparons avec la requête suivante :
SELECT C.NC FROM COMMANDES CWHERE C.NC = 1 AND C.QTE = ( SELECT Sum (E.QTE)
FROM EXPEDITIONS E WHERE E.NC = 1 )
Qu'est ce qu'elle calcule ?