La clause GROUP BY en SQL
La clause GROUP BY en SQL permet d'organiser des données identiques en groupes à l'aide de certaines fonctions. C'est-à-dire que si une colonne particulière a les mêmes valeurs dans différentes lignes, elle organisera ces lignes dans un groupe.
- La clause GROUP BY est utilisée avec l'instruction SELECT.
- Dans la requête, la clause GROUP BY est placée après la clause WHERE.
- Dans la requête, la clause GROUP BY est placée avant la clause ORDER BY si elle est utilisée.
Vous pouvez également utiliser des fonctions d'agrégation telles que COUNT, SUM, MIN, MAX, AVG, etc. sur la colonne groupée.
Syntaxe
SELECT colonne1, colonne2, ..., colonneN,
fonction_agregation(colonne)
FROM tables
[WHERE conditions]
GROUP BY colonne1, colonne2, ..., colonneN;- colonne1, colonne2, ... colonneN : colonnes qui ne sont pas encapsulées dans une fonction d'agrégation et doivent être incluses dans la clause GROUP BY.
- fonction_agregation(colonne) : nom de la fonction d'agrégation utilisée (SUM, AVG, COUNT, MIN, MAX...).
- WHERE conditions : optionnel. Spécifie les conditions pour filtrer les enregistrements avant regroupement.
Tables d'exemple
Pendant ce cours, nous allons travailler sur ces deux tables :
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 30 | 9000.00 | Ingenieur | 1 |
| 7 | Mostafa | 29 | 7500.00 | Ingenieur | NULL |
+----+---------+-----+---------+------------+------+Table - Departement
+--------+--------------+
| Id_dep | Nom_dep |
+--------+--------------+
| 1 | Informatique |
| 2 | RH |
| 3 | Vente |
| 4 | Strategies |
+--------+--------------+Regroupement à l'aide d'une seule colonne
Regrouper avec une seule colonne signifie placer toutes les lignes ayant la même valeur pour cette colonne dans un groupe.
Pour mieux comprendre l'effet de la clause GROUP BY, exécutons d'abord une requête simple qui renvoie toutes les valeurs de la colonne Age :
Exemple n°1
SELECT Age FROM Employes;+-----+ | Age | +-----+ | 25 | | 30 | | 29 | | 30 | | 30 | | 29 | +-----+
Maintenant, utilisons GROUP BY pour obtenir les valeurs uniques :
Exemple n°2
SELECT Age FROM Employes GROUP BY Age;+-----+ | Age | +-----+ | 25 | | 29 | | 30 | +-----+
Notez que seuls trois résultats ont été renvoyés. C'est parce que nous n'avons que trois âges différents. La clause GROUP BY a regroupé tous les employés par âge et n'a renvoyé qu'une seule ligne par groupe :
Groupe 1 - Age = 25 +-----+ | Age | +-----+ | 25 | +-----+ Groupe 2 - Age = 29 +-----+ | Age | +-----+ | 29 | | 29 | +-----+ Groupe 3 - Age = 30 +-----+ | Age | +-----+ | 30 | | 30 | | 30 | +-----+
On peut maintenant compter le nombre d'employés dans chaque groupe avec la fonction COUNT :
Exemple n°3
SELECT Age, COUNT(*) AS "Nombre d'employés" FROM Employes GROUP BY Age;+-----+--------------------+ | Age | Nombre d'employés | +-----+--------------------+ | 25 | 1 | | 29 | 2 | | 30 | 3 | +-----+--------------------+
Exemple n°4
SELECT Age, AVG(Salaire) AS "Salaire moyen" FROM Employes GROUP BY Age;+-----+---------------+ | Age | Salaire moyen | +-----+---------------+ | 25 | 6000.000000 | | 29 | 6750.000000 | | 30 | 8000.133333 | +-----+---------------+
Exemple n°5
SELECT Dep, COUNT(Dep) AS "Nombre d'employés" FROM Employes GROUP BY Dep;+------+--------------------+ | Dep | Nombre d'employés | +------+--------------------+ | NULL | 0 | | 1 | 2 | | 2 | 1 | | 3 | 1 | | 4 | 1 | +------+--------------------+
Exemple n°6
SELECT D.Nom_dep, COUNT(E.Dep) AS "Nombre d'employés"
FROM Employes AS E
INNER JOIN Departement AS D ON E.Dep = D.Id_dep
GROUP BY D.Nom_dep;+--------------+--------------------+ | Nom_dep | Nombre d'employés | +--------------+--------------------+ | Informatique | 2 | | RH | 1 | | Strategies | 1 | | Vente | 1 | +--------------+--------------------+
Regroupement sur plusieurs colonnes
Regrouper par plusieurs colonnes, par exemple GROUP BY colonne1, colonne2, signifie placer toutes les lignes avec les mêmes valeurs pour ces colonnes dans un même groupe.
Exemple n°7
SELECT Age, Dep, COUNT(*) FROM Employes GROUP BY Age, Dep;+-----+------+----------+ | Age | Dep | COUNT(*) | +-----+------+----------+ | 25 | 2 | 1 | | 29 | NULL | 1 | | 29 | 3 | 1 | | 30 | 1 | 2 | | 30 | 4 | 1 | +-----+------+----------+
Exemple n°8
SELECT D.Nom_dep, E.Age, COUNT(E.Dep) AS "Nombre d'employés"
FROM Employes AS E
INNER JOIN Departement AS D ON E.Dep = D.Id_dep
GROUP BY D.Nom_dep, E.Age;+--------------+-----+--------------------+ | Nom_dep | Age | Nombre d'employés | +--------------+-----+--------------------+ | Informatique | 30 | 2 | | RH | 25 | 1 | | Strategies | 30 | 1 | | Vente | 29 | 1 | +--------------+-----+--------------------+
La clause HAVING
La clause WHERE est utilisée pour imposer des conditions aux colonnes. La clause HAVING est utilisée pour imposer des conditions aux groupes.
On ne peut pas utiliser les fonctions d'agrégation (SUM, COUNT, AVG, etc.) avec la clause WHERE. On doit donc utiliser la clause HAVING pour filtrer les groupes avec ces fonctions.
Syntaxe
SELECT colonne1, colonne2, ..., colonneN,
fonction_agregation(colonne)
FROM tables
[WHERE conditions]
GROUP BY colonne1, colonne2, ..., colonneN
HAVING condition;Exemple n°9
SELECT D.Nom_dep, AVG(E.Salaire) AS "Salaire moyen"
FROM Employes AS E
INNER JOIN Departement AS D ON E.Dep = D.Id_dep
GROUP BY D.Nom_dep;+--------------+---------------+ | Nom_dep | Salaire moyen | +--------------+---------------+ | Informatique | 8500.200000 | | RH | 6000.000000 | | Strategies | 7000.000000 | | Vente | 6000.000000 | +--------------+---------------+
Maintenant, filtrons pour n'afficher que les départements dont le salaire moyen est supérieur à 6000 :
Exemple n°10
SELECT D.Nom_dep, AVG(E.Salaire) AS "Salaire moyen"
FROM Employes AS E
INNER JOIN Departement AS D ON E.Dep = D.Id_dep
GROUP BY D.Nom_dep
HAVING AVG(E.Salaire) > 6000;+--------------+---------------+ | Nom_dep | Salaire moyen | +--------------+---------------+ | Informatique | 8500.200000 | | Strategies | 7000.000000 | +--------------+---------------+
Différence entre WHERE et HAVING
| Clause | Quand l'utiliser | Fonctions d'agrégation | Ordre d'exécution |
|---|---|---|---|
| WHERE | Filtrer les lignes individuelles avant regroupement | Non autorisées | Avant GROUP BY |
| HAVING | Filtrer les groupes après regroupement | Autorisées | Après GROUP BY |
- GROUP BY regroupe les lignes ayant les mêmes valeurs dans les colonnes spécifiées.
- On utilise des fonctions d'agrégation (COUNT, SUM, AVG, MIN, MAX) sur les groupes.
- Toutes les colonnes non agrégées dans SELECT doivent figurer dans GROUP BY.
- La clause WHERE filtre les lignes avant regroupement.
- La clause HAVING filtre les groupes après regroupement (avec fonctions d'agrégation).
- Ordre des clauses : WHERE → GROUP BY → HAVING → ORDER BY.
- On peut regrouper sur une ou plusieurs colonnes.
- Les valeurs NULL sont traitées comme un groupe séparé.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.