La clause GROUP BY¶
- Un SELECT permet d'extraire des données et de spécifier les colonnes à retourner
- La clause WHERE permet de limiter les lignes retournées dans la table
- Les fonctions d’agrégat servent à résumer plusieurs lignes d’une table pour produire une seule valeur
La clause GROUP BY permet de regrouper des lignes qui ont la même valeur dans une ou plusieurs colonnes, afin de faire des calculs sur chaque groupe.
GROUP BY sert à répondre à des questions du type :
- Combien d’étudiants par programme ?
- Quelle est la moyenne des notes par cours ?
- Combien de ventes par mois ?
- Quel est le total des ventes par employé ?
Le SGBD va procéder à créer des sous-groupes (programme, cours, mois, employé), puis il appliquera la fonction d'agrégat pour chaque groupe.
Elle est donc presque toujours utilisée avec des fonctions d’agrégat, comme :
- COUNT() → compter
- SUM() → additionner
- AVG( → moyenne
- MIN() → valeur minimale
- MAX() → valeur maximale
Exemple avec Count()¶
Selon les donnée suivantes :
| noEtudiant | nom | programme |
|---|---|---|
| 1 | Léa | Informatique |
| 2 | Marc | Informatique |
| 3 | Sara | Comptabilité |
| 4 | Adam | Informatique |
Si on écrit :
SELECT COUNT(*)
FROM Etudiant;
On obtient le résultat : 4 qui représente le nombre total d'étudiants.
Si on veut savoir **Combien d’étudiants par programme ?*, on écrit :
SELECT programme, COUNT(*) AS "Nombre d'étudiant"
FROM Etudiant
GROUP BY programme;
Résultat :
| programme | Nombre d'étudiants |
|---|---|
| Informatique | 3 |
| Comptabilité | 1 |
Explication :
- Le SGBD regroupe les lignes par programme.
- Il compte le nombre d’étudiants dans chaque groupe.
- Il affiche un résultat par groupe.
Exemple avec SUM()¶
La fonction SUM() s'utilise obligatoirement avec une colonne de données numériques.
Soit la table Commandes :
| noCommande | employe | montant |
|---|---|---|
| 1 | Julie | 100 |
| 2 | Marc | 200 |
| 3 | Julie | 150 |
| 4 | Marc | 50 |
Quel est le total des ventes par employé ?
On écrit :
SELECT employe, SUM(montant) AS "Total par employé"
FROM Commande
GROUP BY employe;
Résultat :
| employe | Total par employé |
|---|---|
| Julie | 250 |
| Marc | 250 |
Regroupement sur plusieurs colonnes¶
Lorsqu'on demande un retour de plusieurs colonnes avec une fonction d'agrégat, on doit s'assurer d'indiquer quoi faire avec chaque colonne, sinon, on obtient une erreur.
Exemple :
Soit les données suivantes :
| noEtudiant | nom | programme | groupe |
|---|---|---|---|
| 1 | Léa | Informatique | 1 |
| 2 | Marc | Informatique | 2 |
| 3 | Sara | Comptabilité | 1 |
| 4 | Adam | Informatique | 1 |
Et qu'on désire connaître le nombre d'étudiants par groupe dans chaque programme.
❌ La requête suivante est en erreur :
SELECT programme, groupe, COUNT(*)
FROM Etudiant
GROUP BY programme;
Car dans un programme, il peut y avoir plus d'un groupe et donc la BD ne peut retourner une seule valeur.
✔ Solution : regrouper par plusieurs colonnes.
SELECT programme, groupe, COUNT(*)
FROM Etudiant
GROUP BY programme, groupe;
Ici, SQL crée un groupe pour chaque combinaison unique possible par le GROUP BY :
- Informatique, groupe 1
- Informatique, groupe 2
- Comptatbilité, groupe 1
- etc.
Puis, compte le nombre de lignes dans chaque groupe, pour le résultat suivant :
| programme | groupe | COUNT(*) |
|---|---|---|
| Informatique | 1 | 2 |
| Informatique | 2 | 1 |
| Comptabilité | 1 | 1 |
Règle très importante¶
Quand on utilise GROUP BY :
👉 Toutes les colonnes retournées par le SELECT doivent être :
- soit dans une fonction d’agrégat
- soit présentes dans le GROUP BY
Ordre d'exécution¶
Même si on écrit :
SELECT programme, COUNT(*)
FROM Etudiant
GROUP BY programme;
SQL exécute dans cet ordre logique :
- FROM : lecture de la table
- GROUP BY : création de sous-groupes
- Calcul d'agrégats
- SELECT : Extraction des colonnes voulues pour l'affichage
Et avec une condition WHERE et un tri ORDER BY, l'ordre est :
- FROM : lecture de la table
- WHERE : filtrer les lignes
- GROUP BY : création de sous-groupes
- Calcul d'agrégats
- SELECT : Extraction des colonnes voulues pour l'affichage
- ORDER BY : tri des lignes