AGREGATS OU FONCTIONS


DEFINITION

* 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

FONCTIONS DANS LE SELECT

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.

FONCTION DANS LE WHERE

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"


SELECT	C.NC

FROM COMMANDES C

WHERE C.QTE = ( SELECT Sum (E.QTE)

FROM EXPEDITIONS E WHERE E.NC = 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  C

WHERE C.NC = 1 AND C.QTE = ( SELECT Sum (E.QTE)

FROM EXPEDITIONS E WHERE E.NC = 1 )

Qu'est ce qu'elle calcule ?



© B. Defude - INT Evry