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é.

Densite de population triée

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 :

Population des communes

la requête :

SELECT nom_dept, sum(population) AS population_dept FROM commune GROUP BY nom_dept

renvoie :

Agrégation par département

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émentLa 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.