Tri et agrégation
Tri
Il est possible de classer le résultat d'une requête en ajoutant le mot clef ORDER BY suivi d'une liste de champs.
Exemple : SELECT * FROM commune ORDER BY nom_comm
pour classer le résultat par nom de commune.
Un tri décroissant peut-être obtenu en ajoutant DESC.
Exemple : SELECT * FROM commune ORDER BY nom_comm DESC
SELECT nom_comm, round(cast(population as float)/superficie,2) AS densite FROM commune ORDER BY densite
retourne la densité de population par ordre croissant de densité.

Remarque :
Sous PostGIS on écrira
SELECT nom_comm, round(population/superficie :: numeric,2) AS densite FROM commune ORDER BY densite)
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
nb : 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.