IV.5.4. Les fonctions de groupes
Ces choses étant dites, dans les exemples
précédents, chaque ligne résultat d'un SELECT était
calculée sur les valeurs d'une seule ligne de la table consultée.
Il existe un autre type de SELECT qui permet d'effectuer des calculs sur
l'ensemble des valeurs d'une colonne, au moyen de l'une des
fonctions de groupe suivantes (toutes portent sur une expression,
qui peut-être un attribut d'une table ou un attribut calculé) :
SUM(expr) Somme des valeurs
AVG(expr) Moyenne des valeurs
COUNT([DISTINCT] expr) Nombre de valeurs (différentes
si
DISTINCT est présent)
COUNT(*) Compte toutes les lignes de la table
MIN(expr) ouMAX(expr) Minimum ou maximum des valeurs
VARIANCE(expr) ouSTDDEV(expr) Variance ou écart-type des
valeurs Cas pratique : Donner le total des salaires
des employés travaillant dans le département 10 :
SELECT SUM(salaire) AS som_salaires FROM employes WHERE
_num_dep=10;
Calcul de résultats sur plusieurs
groupes. Il est possible de subdiviser la table en
groupes, chaque groupe étant l'ensemble des
lignes ayant une valeur commune pour les expressions spécifiées.
C'est la clause GROUP BY qui permet de découper la table en plusieurs
groupes :
81
GROUP BY expr1, expr2, ...
Si l'on en tient compte du regroupement suivant une seule
expression, ceci définit les groupes comme les ensembles de lignes pour
lesquelles cette expression prend la même valeur. Si plusieurs
expressions sont présentes, le groupement va s'effectuer d'abord sur la
première, puis sur la seconde, et ainsi de suite : parmi toutes les
lignes pour lesquelles expr1prend la même valeur, on regroupe celles
ayant expr2identique, etc. Un SELECT de groupe avec une clause GROUP BY donnera
une ligne résultat pour chaque groupe.
Cas pratique : Donner le total des
salaires des employés pour chaque département :
SELECT_num_dep,SUM(salaire)AS som_salaires FROM employes GROUP BY
_num_dep;
Sélection des groupes. De
même que la clause WHERE permet de sélectionner certaines lignes,
il est possible de ne retenir, dans un SELECT comportant une fonction de
groupe, que les lignes répondant à un critère donné
par la clause HAVING. Cette clause se place après la clause GROUP BY et
son prédicat suit les mêmes règles de syntaxe que celui de
la clause WHERE, à la différence près qu'il ne peut porter
que sur des caractéristiques du groupe (fonction de groupe ou expression
figurant dans la clause GROUP BY).
Cas pratique : Donner la liste des
salaires moyens par fonction pour les groupes ayant plus de 2 employés
:
SELECT fonction, COUNT(*) AS nb_employes, AVG(salaire) AS
moy_salaires FROM employes GROUP BY fonction HAVING COUNT(*)>2;
Retenons que :
Dans la liste des colonnes résultat d'un SELECT
comportant une fonction de groupe, ne peuvent figurer que des
caractéristiques de groupe, c'est-à-dire soit des fonctions de
groupe, soit des expressions figurant dans la clause GROUP BY. En effet, de
manière générale, lorsqu'un attribut est
sélectionné dans une clause SELECT, le résultat peut
comporter de zéro à n valeurs ; cela pourrait provoquer des
conflits si l'on utilisait conjointement des fonctions statistiques qui, elles,
ne retournent qu'une seule valeur.
Un SELECT de groupe peut contenir à la fois les clauses
WHERE et HAVING. La première sera d'abord appliquée pour
sélectionner les lignes, puis les fonctions de groupe seront
évaluées, et les groupes ainsi constitués seront
sélectionnés suivant le prédicat de la clause HAVING.
82
Cas pratique : Pour les
départements comportant au moins 2 employés techniciens ou
commerciaux, donner le nombre de ces employés par département
:
SELECT _num_dep, COUNT(*) AS nb_techn_ou_comm FROM employes WHERE
fonction in('Technicien','Commercial')
GROUP BY _num_dep HAVING COUNT(*)>=2;
- Un SELECT de groupe peut être utilisé dans une
sous-interrogation ; inversement, une clause HAVING peut comporter une
sous-interrogation.
|