Dans les exemples précedents, chaque ligne résultat d'un SELECT était le résultat de calculs 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. Ces
calculs sur
l'ensemble des
valeurs d'une colonne se font au moyen de l'une des fonctions suivantes :
AVG([DISTINCT | ALL]
expression)
Renvoie la moyenne des valeurs d'
expression.
COUNT(* | [DISTINCT |
ALL] expression)
Renvoie le nombre de lignes du résultat de la requête.
Si expression est présent, on ne compte
que les lignes pour lesquelles
cette expression n'est pas NULL.
MAX([DISTINCT | ALL]
expression)
Renvoie la plus petite des valeurs
d'expression.
MIN([DISTINCT | ALL]
expression)
Renvoie la plus grande des valeurs
d'expression.
STDDEV([DISTINCT | ALL]
expression)
Renvoie l'écart-type des valeurs d'expression.
SUM([DISTINCT | ALL]
expression)
Renvoie la somme des valeurs
VARIANCE([DISTINCT |
ALL] expression)
Renvoie la variance des valeurs d'expression.
DISTINCT
Indique à la fonction de groupe de ne prendre en compte que des
valeurs distinctes.
ALL
Indique à la fonction de groupe de prendre en compte toutes les valeurs,
c'est la valeur par défaut.
Exemple :
Donner le total des salaires du département 10.
Exemple :
Donner le nom, la fonction et le salaire de l'employé (ou des employés)
ayant le salaire le plus élevé.
Remarques
Ces SELECT
sont différents de ceux vus précédemment. Il est, par
exemple, impossible de demander en résultat à la fois une colonne et une
fonction de groupe.
un SELECT comportant une fonction
de groupe peut être utilisé dans une
sous-interrogation.
Aucune des fonctions de groupe ne tient compte des valeurs NULL
à l'exception de count(*).
Ainsi, SUM(col) est la somme des valeurs
non
NULL de la colonne col.
De même AVG est la somme des valeurs non
NULL divisée par le nombre de valeurs non NULL.
Il est possible de subdiviser la table en groupes, chaque groupe étant
l'ensemble des lignes ayant
une valeur commune. C'est la clause GROUP
BY qui
permet de découper la table en plusieurs groupes :
GROUP BY expr_1, expr_2, ...
Si on a 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 les groupes sont définis de la façon suivante : parmi toutes les
lignes
pour lesquelles expr_1 prend la
même valeur, on regroupe celles ayant expr_2 identique, ...
Un SELECT de groupe avec une clause
GROUP BY donnera une ligne résultat pour chaque groupe.
Exemple :
Total des salaires pour chaque département
Remarque :
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 :
De la même façon qu'il est possible de sélectionner
certaines lignes au
moyen de la clause WHERE, il est possible dans un SELECT comportant une fonction de groupe
de sélectionner par la clause HAVING, qui se place après la
clause GROUP BY.
Le prédicat dans la clause HAVING suit les mêmes règles de
syntaxe qu'un prédicat figurant dans une clause WHERE.
Cependant, il ne peut porter que sur des caractéristiques du groupe :
fonction de groupe ou expression figurant dans la clause GROUP
BY, dans ce cas la clause
HAVING doit être placée après la clause
GROUP BY.
Exemple :
Donner la liste des salaires moyens par fonction pour les groupes ayant
plus de deux employés.
Remarque :
Un SELECT de groupe peut contenir à la
fois une
clause WHERE et une clause
HAVING.
La clause WHERE sera d'abord appliquée
pour sélectionner les lignes, puis les groupes seront constitués à partir
des lignes sélectionnées, et les fonctions de groupe seront évaluées.
Exemple :
Donner le nombre d'ingénieurs ou de commerciaux des départements ayant au
moins deux employés de ces catégories.
Une clause HAVING peut comporter une
sous-interrogation.
Exemple :
Quel est le département ayant le plus d'employés?
Il est possible d'appliquer au résultat d'un SELECT avec GROUP BY un deuxième
niveau de fonction de groupe.
Exemple :
la fonction MAX peut être appliquée aux nombres d'employés de
chaque département pour obtenir le nombre d'employés du département ayant
le plus d'employés.