La clause GROUPE BY

GROUP BY est utilisé pour regrouper les enregistrements (lignes) d’une colonne en plusieurs groupes selon un ou plusieurs critères. GROUPE BY est utilisé par les fonctions d’agrégations (SUM, AGV, MAX, MIN, COUNT, …) qui ont pour action de faire des calculs sur un ensemble d’enregistrements et de renvoyer un résultat unique. Ces fonctions d’agrégation lorsqu’elles sont utilisées sans la clause GROUP BY, elles affichent un seul résultat en sortie. Par contre, lorsqu’on les associe avec la clause GROUP BY, on peut obtenir un ou plusieurs résultats selon les valeurs d’une colonne donnée.

Une requête avec la clause GROUP BY est composée d’un ou plusieurs attributs du partitionnement et d’une fonction d’agrégation.

Prenons par exemple notre table employee ci-dessous dont on a coupé juste l’en-tête de la table avec  un seul enregistrement. On va se baser sur cette table pour donner la syntaxe d’une requête avec GROUP BY.

Voici la syntaxe:

SELECT COUNT(last_name) FROM employee GROUP BY service_number ;

Ou

SELECT service_number, COUNT(last_name) FROM employee GROUP BY service_number ;

COUNT (last_name) est une fonction d’agrégation qui permet de compter les valeurs d’une colonne donnée ; ici on compte les noms (last_name) des employés.

service_number est l’attribut ou champ ou colonne de la table employee. On l’appelle encore attribut de partitionnement.

Si on prend une fonction d’agrégation par exemple COUNT () qui signifie compter, on va afficher le nombre total de noms des employés de la table  employee. Par contre si on prend cette même fonction avec la clause (instruction) GROUP BY, on va afficher le nombre total de noms des employés groupés par numéros de service (service_number). On regroupe alors le nombre selon leurs numéros de service (service_number).

Table complète employee

id_employeelast_nameservice_numbercountryage
1Jones1England25
2Jack3Italy30
3William1Mexico27
4Michael2England20
5Noah1England18
6Hilary2England21
7Luca1Italy17

 

 

 

 

 

 

 

Exemple : Affichons le nombre des employés par numéro de service, c’est-à-dire le nombre d’employés dans chaque numéro de service.

SELECT service_number, COUNT(last_name) FROM employee GROUP BY service_number ;

Résultat :

Service_numberCOUNT (last_name)
14
 22
31

 

On a utilisé la fonction d’agrégation COUNT () pour compter le nombre d’employés et la clause GROUP BY a permis de répartir ce nombre selon les numéros de service  qui existent dans la colonne service_number.

Attributs de partitionnement dans GROUP BY

Un attribut de partitionnement contient un ou plusieurs valeurs et c’est le nombre de ces différentes valeurs qui détermine le nombre de groupes avec GROUP BY. Par exemple si un attribut de partitionnement contient 4 différentes valeurs, on aura 4 groupes à la sortie.

Dans notre cas, on a pris par exemple l’attribut service_number qui a 3 valeurs différentes ; donc toute requête de la fonction d’agrégat avec GROUP BY sur cet attribut aura forcément en sortie 3 groupes.

Remarque 1:

Tous les attributs de partitionnement doivent être spécifiés dans le GROUP BY.

En prenant notre table employee, on peut par exemple écrire :

SELECT COUNT(last_name) FROM employee GROUP BY service_number ;

Ou

SELECT service_number, COUNT(last_name) FROM employee GROUP BY service_number ;

Remarque2 :

Tous les attributs mentionnés du côté SELECT doivent obligatoirement être mentionnés du côté GROUP BY  et sont considérés comme des attributs de partitionnement.

Exemple on peut écrire :

SELECT age, service_number, COUNT(last_name) FROM employee GROUP BY age, service_number;

Seulement on ne peut pas écrire :

SELECT age, service_number, COUNT(last_name) FROM employee GROUP BY  service_number ;

Ou

SELECT age, service_number, COUNT(last_name) FROM employee GROUP BY age ;

Ceci va donner des résultats erronés car il y a manque d’attribut de partitionnement dans GROUP BY. Ces deux expressions faussent la règle des fonctions d’agrégation.

 

La clause HAVING

La clause HAVING a été ajoutée au langage SQL car la clause WHERE n’a pas pu être utilisée pour faire le filtrage avec des fonctions d’agrégation.

Dans les fonctions d’agrégation, l’instruction (clause) GROUP BY permet de regrouper certaines valeurs selon des critères donnés et l’instruction HAVING vient filtrer ces valeurs groupées en un ou plusieurs groupes. D’une manière générale, la clause HAVING permet de filtrer les résultats des groupes.

HAVING nécessite la présence d’une clause GROUP BY.

 

Par exemple avec notre table employee, on affiche le nombre de personnes groupées par numéro de services et ayant l’âge inférieur à 20.

 

id_employeelast_nameservice_numbercountryage
1Jones1England25
2Jack3Italy30
3William1Mexico27
4Michael2England20
5Noah1England18
6Hilary2England21
7Luca1Italy17

 

 

 

 

 

 

 

 

 

 

SELECT service_number, age, COUNT(last_name) AS ‘number’ FROM employee GROUP BY service_number HAVING age <30 ;

Résultat :

service_numberagenumber
1254
2202

 

On constate que les employés dont l’âge dépasse 30 n’ont pas été comptés grâce à HAVING qui a conditionné la restriction sur certaines valeurs.

 

La clause HAVING avec ORDER BY

La clause ORDER BY choisit l’ordre d’affichage des résultats retournés par HAVING. Cet ordre peut être croissant (ASC) ou décroissant.

Exemple : On affiche le nombre des employés classés par numéro de service, ayant l’âge inférieur à 30 et grouper par numéro de service par ordre décroissant.

SELECT service_number, age, COUNT(last_name) AS ‘number’ FROM employee GROUP BY service_number HAVING age <30 ORDER BY service_number DESC ;

 

Service_numberagenumber
2202
1254

 

Remarque :

La clause WHERE et la clause HAVING permettent  de faire le filtrage des valeurs. La différence entre les deux est que :

La clause WHERE est utilisée pour filtrer les lignes individuelles des tables.

La clause HAVING est utilisée pour filtrer les lignes des groupes des tables.

HAVING est utilisée avec GROUPE BY qui à son tour est utilisée par les fonctions d’agrégation.