Agrégations
Une agrégation est une opération qui permet de regrouper les enregistrements de la table en sortie selon des critères et d'obtenir des informations statistiques sur ces regroupements. Il faut utiliser l'expression GROUP BY suivi du critère de regroupement.
Prenons un exemple à partir de la table COMMUNE. Nous souhaitons obtenir la population totale par département.
SELECT Nom_comm, nom_dept, population FROM commune;
nous donne :

La requête :
SELECT nom_dept, sum(population) AS population_dept FROM commune GROUP BY nom_dept;
renvoie :

La clause GROUP BY fonctionne de concert avec les fonctions d'agrégation (ici sum()). Les principales fonctions d'agrégation sont :
count() : renvoie le nombre d'enregistrements
sum() : renvoie la somme
max() : maximum
min() : minimum
avg() : moyenne
Complément : La clause HAVING
Il se peut que l'on souhaite mettre un critère de sélection sur une colonne calculée par l'opération d'agrégation. Dans l'exemple ça serait le cas si on souhaite n'afficher que les départements de plus de 20000 habitants.
On pourrait être tenté d'écrire une requête de la forme :
SELECT nom_dept, sum(population) AS population_dept FROM commune WHERE population_dept > 20000 GROUP BY nom_dept;
ça ne marche pas car la clause where est exécutée avant l'agrégation.
La clause HAVING permet d'indiquer au SQL d'effectuer une nouvelle sélection à la fin du calcul sur les résultats du regroupement.
On écrira donc:
SELECT nom_dept, sum(population) AS population_dept FROM commune GROUP BY nom_dept HAVING population_dept > 20000;
Sous PostgreSQL il faut répéter la fonction d'agrégation dans la clause having
SELECT nom_dept, sum(population) AS population_dept FROM commune GROUP BY nom_dept HAVING sum(population) > 20000;
Note : On n'utilisera la clause HAVING que dans le cas ou la sélection porte sur une colonne d'agrégation calculée, pour une sélection sur une colonne existante dans la table de départ on utilisera une condition dans la clause WHERE.