CodeGym /Cours /SQL SELF /Groupement des données (GROUP BY) : syntaxe et structure

Groupement des données (GROUP BY) : syntaxe et structure

SQL SELF
Niveau 8 , Leçon 0
Disponible

Imagine que tu bosses avec des milliers de lignes de données — comment tu trouves du sens là-dedans ? C'est là que l'opérateur GROUP BY entre en scène — c'est un vrai chef d'orchestre dans le monde SQL. Il prend des données éparpillées et les transforme en une mélodie claire : il compte, regroupe, fait des totaux. Tu veux savoir combien de commandes chaque client a passé, combien d'étudiants il y a dans chaque cours ou comment les salaires sont répartis par département ? Tout ça, c'est le taf de GROUP BY. Aujourd'hui, on va voir comment devenir pote avec lui et tirer le max de tes tables.

Le groupement, c'est le processus qui consiste à rassembler les lignes qui ont les mêmes valeurs dans une ou plusieurs colonnes en groupes logiques. Ça permet d'appliquer des fonctions d'agrégation séparément à chaque groupe.

Imagine que t'as une table d'employés et que tu veux connaître le salaire moyen par département. Un département — un groupe. SQL utilise GROUP BY pour diviser la table des employés par département, puis applique AVG() à chaque groupe.

Syntaxe de GROUP BY

La règle principale pour utiliser le groupement en SQL : si tu utilises GROUP BY, chaque colonne qui n'est pas dans une fonction d'agrégation doit être listée dans GROUP BY.

Syntaxe :

SELECT colonne1, 
       fonction_agregat(colonne2)
FROM table
GROUP BY colonne1;

Étapes :

  1. Indique la colonne sur laquelle tu veux grouper les données dans GROUP BY.
  2. Utilise des fonctions d'agrégation pour calculer des valeurs dans les groupes.
  3. Toutes les colonnes dans SELECT qui ne sont pas dans des fonctions d'agrégation doivent être listées dans GROUP BY. Oui, SQL est strict là-dessus, et si t'oublies, il te le rappellera avec une erreur.

Exemple : Groupement des étudiants par faculté

Imaginons qu'on a une table students qui stocke les infos sur les étudiants :

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Maintenant, on veut connaître la moyenne des notes (GPA) pour chaque faculté. Pour ça, on écrit une requête avec GROUP BY :

SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;

Résultat :

faculty avg_gpa
ComputerSci 3.9
Math 3.7
Physics 3.7

SQL a d'abord séparé les données en groupes selon la colonne faculty, puis il a appliqué la fonction AVG() à chaque groupe.

Particularités de GROUP BY

  1. Exigences pour les colonnes dans SELECT

SQL exige que toutes les colonnes que tu mets dans SELECT mais que tu n'utilises pas dans des fonctions d'agrégation (genre SUM(), COUNT()), soient mentionnées dans GROUP BY. Sinon, SQL ne sait pas quoi afficher.

Essaie d'exécuter cette requête et tu vas avoir une erreur :

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;

Erreur : la colonne name n'est pas dans GROUP BY. Pour corriger ça, ajoute name dans GROUP BY :

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;

Mais là, ça va grouper les données au niveau de chaque étudiant — pas vraiment ce qu'on voulait au départ.

  1. Groupement sur plusieurs colonnes

Tu peux grouper les données non seulement sur une colonne, mais sur plusieurs. Par exemple, en plus des facultés, on veut grouper les étudiants par leur nom. Il suffit d'ajouter une deuxième colonne dans GROUP BY :

SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;

Table de départ :

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Résultat :

faculty name avg_gpa
ComputerSci Alex Lin 3.8
ComputerSci Anna Song 4.0
Math Maria Chi 3.5
Math Otto Art 3.9
Physics Liam Park 3.7
  1. Groupement avec plusieurs fonctions d'agrégation

Ne te limite pas à une seule fonction ! Par exemple, on veut compter le nombre d'étudiants par faculté et calculer la moyenne des notes :

SELECT faculty,
       COUNT(*) AS student_count, 
       AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;

Table de départ :

id name faculty gpa
1 Alex Lin ComputerSci 3.8
2 Maria Chi Math 3.5
3 Anna Song ComputerSci 4.0
4 Otto Art Math 3.9
5 Liam Park Physics 3.7

Résultat :

faculty student_count avg_gpa
ComputerSci 2 3.9
Math 2 3.7
Physics 1 3.7

Particularités du groupement en SQL : ce qu'on peut et ne peut pas sélectionner

Écrire des requêtes avec groupement, c'est facile, mais la moitié de tes requêtes risque de ne pas marcher. Le groupement ne fonctionne pas tout à fait comme on l'imagine dans la tête.

Si t'as un GROUP BY dans ta requête SQL, pense à toutes les colonnes du résultat comme à des expressions calculées. Les colonnes dans SELECT peuvent être de deux types :

  • calculées par des fonctions d'agrégation sur les colonnes du groupe.
  • prises depuis GROUP BY — c'est-à-dire qu'il faut grouper dessus.

Si tu fais une requête GROUP BY sur la table des étudiants, dans la table résultat tu ne peux pas avoir des étudiants précis ! Tu peux avoir la taille moyenne, le poids moyen, la note moyenne. Ce code ne marchera pas :

SELECT faculty, name
FROM students
GROUP BY faculty;

Essayons de comprendre pourquoi.

L'opérateur GROUP BY faculty va diviser les étudiants de la table students en groupes avec le même faculty pour chaque groupe. Comme tous les étudiants du groupe ont le même faculty, on peut dire que l'attribut faculty appartient au groupe d'étudiants. Mais name est différent pour chaque étudiant. Donc le groupe n'a pas d'attribut name.

L'opérateur GROUP BY faculty, gender va diviser les étudiants de la table students en groupes avec le même faculty et gender pour chaque groupe. Donc tous les étudiants de chaque groupe auront le même faculty et gender. On peut donc dire que le groupe d'étudiants a les attributs faculty et gender. Mais il n'y a toujours pas de name unique pour le groupe.

Ça, tu peux l'écrire :

SELECT faculty, gender
FROM students
GROUP BY faculty, gender;

Tu peux même faire comme ça :

SELECT
    faculty, 
    gender, 
    AVG(age) as group_avg_age,  -- La valeur est calculée à partir des valeurs age du groupe d'étudiants
    MAX(high) as group_high     -- La valeur est calculée à partir des valeurs high du groupe d'étudiants
FROM students
GROUP BY faculty, gender;

Mais tu ne peux pas juste utiliser age et high dans SELECT dans notre cas.

Erreurs courantes avec GROUP BY

Quand tu commences à écrire des requêtes avec GROUP BY, voilà quelques pièges classiques qui peuvent t'attendre :

  1. Toutes les colonnes ne sont pas dans SELECT. Rappelle-toi, chaque colonne qui n'est pas un agrégat doit être dans GROUP BY. Sinon SQL ne saura pas comment l'afficher.

  2. Groupement sur NULL. Les valeurs NULL sont considérées comme un groupe séparé. Si ta colonne a des NULL, SQL va créer un groupe pour NULL.

  3. Groupes en trop. Si tu ajoutes accidentellement trop de colonnes dans GROUP BY, tu risques d'avoir des résultats trop détaillés, plus durs à analyser.

Maintenant tu sais comment grouper efficacement des données avec GROUP BY. C'est un des outils les plus puissants en SQL, qui te permet de bosser facilement avec des données agrégées et de créer des rapports structurés. Ensuite, on va continuer à plonger dans la magie du groupement et voir comment ajouter des filtres avec HAVING.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION