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_employee | last_name | service_number | country | age |
1 | Jones | 1 | England | 25 |
2 | Jack | 3 | Italy | 30 |
3 | William | 1 | Mexico | 27 |
4 | Michael | 2 | England | 20 |
5 | Noah | 1 | England | 18 |
6 | Hilary | 2 | England | 21 |
7 | Luca | 1 | Italy | 17 |
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_number | COUNT (last_name) |
1 | 4 |
2 | 2 |
3 | 1 |
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_employee | last_name | service_number | country | age |
1 | Jones | 1 | England | 25 |
2 | Jack | 3 | Italy | 30 |
3 | William | 1 | Mexico | 27 |
4 | Michael | 2 | England | 20 |
5 | Noah | 1 | England | 18 |
6 | Hilary | 2 | England | 21 |
7 | Luca | 1 | Italy | 17 |
SELECT service_number, age, COUNT(last_name) AS ‘number’ FROM employee GROUP BY service_number HAVING age <30 ;
Résultat :
service_number | age | number |
1 | 25 | 4 |
2 | 20 | 2 |
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_number | age | number |
2 | 20 | 2 |
1 | 25 | 4 |
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.