MySQL Clause GROUP BY et HAVING avec exemples
โก Rรฉsumรฉ intelligent
Les clauses SQL GROUP BY et HAVING permettent de transformer des lignes dรฉtaillรฉes en rapports de synthรจse. GROUP BY regroupe les lignes partageant les mรชmes valeurs en une seule ligne par groupe, tandis que HAVING filtre ces groupes aprรจs application de fonctions d'agrรฉgation telles que COUNT.

Qu'est-ce que la clause SQL GROUP BY ?
La clause GROUP BY est une commande SQL utilisรฉe pour regrouper les lignes qui ont les mรชmes valeursElle est รฉcrite ร l'intรฉrieur de l'instruction SELECT et est gรฉnรฉralement utilisรฉe avec des fonctions d'agrรฉgation pour produire des rapports de synthรจse ร partir de la base de donnรฉes.
Voilร ce que รงa fait : รงa rรฉsume les donnรฉes Les donnรฉes sont stockรฉes dans la base de donnรฉes. Les requรชtes contenant la clause GROUP BY sont appelรฉes requรชtes groupรฉes et renvoient une seule ligne pour chaque รฉlรฉment groupรฉ.
Syntaxe SQL GROUP BY
Maintenant que l'objectif de cette clause est clair, examinons la syntaxe d'une requรชte groupรฉe de base.
SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];
ICI. (en anglais seulement)
- "Instructions SELECTโฆยซ ยป est la norme SQL SELECT requรชte de commande.
- "PAR GROUPE nom_colonne1ยซ ยป est la clause qui effectue le groupeping basรฉ sur column_name1.
- "[, nom_colonne2, โฆ]ยซ ยป est facultatif et reprรฉsente dโautres noms de colonnes lorsque le groupeping Cela se fait sur plusieurs colonnes.
- "[AVOIR une condition]ยซ ยป est facultatif et sert ร limiter les lignes affectรฉes par la clause GROUP BY. Il est similaire ร clause O, sauf qu'il est appliquรฉ aprรจs le groupeping.
Grouping Utilisation d'une seule colonne
Le moyen le plus rapide d'observer l'effet de la clause SQL GROUP BY est de comparer une requรชte non groupรฉe avec une requรชte groupรฉe. Commencez par une requรชte simple qui renvoie toutes les entrรฉes de genre dans la table des membres.
SELECT `gender` FROM `members`;
| le sexe |
|---|
| femme |
| femme |
| Masculin |
| femme |
| Masculin |
| Masculin |
| Masculin |
| Masculin |
| Masculin |
Neuf lignes sont renvoyรฉes, et chaque valeur est rรฉpรฉtรฉe. Supposons que nous souhaitions obtenir les valeurs uniques pour le genre. La requรชte ci-dessous ajoute la clause GROUP BY.
SELECT `gender` FROM `members` GROUP BY `gender`;
Exรฉcuter le script ci-dessus dans MySQL Workbench contre myflixdb nous donne les rรฉsultats suivants.
| le sexe |
|---|
| femme |
| Masculin |
Notez que seules deux lignes ont รฉtรฉ renvoyรฉes, car la table ne contient que deux types de genre. La clause GROUP BY a regroupรฉ tous les membres ยซ Homme ยป et a renvoyรฉ une seule ligne pour ceux-ci, et elle a fait de mรชme pour les membres ยซ Femme ยป.
Grouping Utilisation de plusieurs colonnes
Grouping L'utilisation d'une seule colonne est souvent trop grossiรจre pour un rapport concret. La fonction GROUP BY accepte une liste de colonnes sรฉparรฉes par des virgules, et la combinaison de leurs valeurs dรฉfinit chaque groupe.
Supposons que nous souhaitions obtenir la liste des identifiants de catรฉgorie de films (category_id) et les annรฉes de sortie correspondantes. Observons d'abord le rรฉsultat de cette requรชte simple.
SELECT `category_id`, `year_released` FROM `movies`;
| id_catรฉgorie | annรฉe_sortie |
|---|---|
| 1 | 2011 |
| 2 | 2008 |
| NULL | 2008 |
| NULL | 2010 |
| 8 | 2007 |
| 6 | 2007 |
| 6 | 2007 |
| 8 | 2005 |
| NULL | 2012 |
| 7 | 1920 |
| 8 | NULL |
| 8 | 1920 |
Les lignes surlignรฉes indiquent que le rรฉsultat contient des doublons. L'exรฉcution de la mรชme requรชte avec GROUP BY permet de les supprimer.
SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;
Exรฉcuter le script ci-dessus dans MySQL L'exรฉcution de Workbench sur la base de donnรฉes myflixdb nous donne les rรฉsultats suivants, prรฉsentรฉs ci-dessous.
| id_catรฉgorie | annรฉe_sortie |
|---|---|
| NULL | 2008 |
| NULL | 2010 |
| NULL | 2012 |
| 1 | 2011 |
| 2 | 2008 |
| 6 | 2007 |
| 7 | 1920 |
| 8 | 1920 |
| 8 | 2005 |
| 8 | 2007 |
La clause GROUP BY opรจre ร la fois sur category_id et year_released pour identifier SรJOUR MรMORABLE lignes. Les deux lignes en double pour la catรฉgorie 6 en 2007 ont รฉtรฉ fusionnรฉes en une seule.
Rรจgle de base: Si l'identifiant de catรฉgorie est identique mais que l'annรฉe de publication diffรจre, la ligne est considรฉrรฉe comme unique. Si l'identifiant de catรฉgorie et l'annรฉe de publication sont identiques pour plusieurs lignes, ces lignes sont considรฉrรฉes comme des doublons et une seule est affichรฉe.
Grouping et fonctions agrรฉgรฉes
Supprimer les doublons est utile, mais la vรฉritable puissance du regroupementping apparaรฎt lorsqu'il est associรฉ ร fonctions d'agrรฉgationUne fonction d'agrรฉgation calcule une valeur pour chaque groupe : COUNT compte les lignes, SUM additionne les valeurs, et AVG, MIN et MAX dรฉcrivent l'รฉtendue.
Supposons que nous souhaitions connaรฎtre le nombre total de membres masculins et fรฉminins dans la base de donnรฉes. Le script ci-dessous permet de le faire.
SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Exรฉcuter le script ci-dessus dans MySQL Workbench appliquรฉ ร myflixdb nous donne les rรฉsultats suivants.
| le sexe | COUNT(`numรฉro_d'adhรฉsion`) |
|---|---|
| femme | 3 |
| Masculin | 6 |
Les lignes sont regroupรฉes selon chaque valeur de genre unique, et le nombre de lignes dans chaque groupe est calculรฉ par la fonction d'agrรฉgation COUNT. Les neuf enregistrements individuels sont regroupรฉs en deux lignes rรฉcapitulatives.
Limiter les rรฉsultats d'une requรชte ร l'aide de la clause HAVING
GroupingLes valeurs ยซ s ยป ne sont pas toujours nรฉcessaires pour chaque ligne d'un tableau. Parfois, le rapport doit รชtre limitรฉ ร un critรจre donnรฉ, et c'est le rรดle de la clause HAVING.
Supposons que nous voulions connaรฎtre toutes les annรฉes de sortie des films de la catรฉgorie 8. Le script ci-dessous permet d'obtenir ce rรฉsultat.
SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;
Exรฉcuter le script ci-dessus dans MySQL L'exรฉcution de Workbench sur la base de donnรฉes myflixdb nous donne les rรฉsultats suivants, prรฉsentรฉs ci-dessous.
| id_film | titre | Directeur | annรฉe_sortie | id_catรฉgorie |
|---|---|---|---|---|
| 9 | Honey moonERS | Jean Schultz | 2005 | 8 |
| 5 | Les petites filles ร papa | NULL | 2007 | 8 |
Seuls les films de catรฉgorie 8 ont รฉtรฉ conservรฉs par la condition HAVING.
Mise en garde: MySQL Les versions 5.7 et ultรฉrieures activent par dรฉfaut le mode ONLY_FULL_GROUP_BY. Dans ce mode, les requรชtes SELECT * avec une clause GROUP BY sont rejetรฉes, car les colonnes movie_id, title et director ne sont ni groupรฉes ni agrรฉgรฉes. En production, il est recommandรฉ de nommer explicitement les colonnes groupรฉes, par exemple : SELECT category_id, year_released FROM movies GROUP BY category_id, year_released HAVING category_id = 8;
WHERE vs HAVING vs GROUP BY vs ORDER BY
Les dรฉbutants confondent souvent ces quatre clauses, car elles contribuent toutes ร l'ensemble des rรฉsultats. La diffรฉrence rรฉside dans quand MySQL Elles s'appliquent : WHERE s'exรฉcute avant le regroupement des lignes, HAVING s'exรฉcute aprรจs et ORDER BY s'exรฉcute en dernier.
| Clause | Ce qu'il fait | Quand il fonctionne | Accepte les fonctions agrรฉgรฉes |
|---|---|---|---|
| Oร | Filtre les lignes individuelles avant tout groupeping. | Avant GROUP BY | Non |
| PAR GROUPE | Regroupe les lignes partageant les mรชmes valeurs en une seule ligne par groupe. | Aprรจs Oร | N'est pas applicable |
| AYANT | Filtre les groupes produits par GROUP BY. | Aprรจs GROUP BY | Oui, par exemple HAVING COUNT(*) > 2 |
| COMMANDร PAR | Trie les lignes qui survivent aux clauses prรฉcรฉdentes. | Nom | Oui, un alias agrรฉgรฉ peut รชtre triรฉ. |
La consรฉquence pratique est un problรจme de performance. Le filtrage avec WHERE supprime les lignes avant le groupe.ping Le travail commence, donc une condition qui ne dรฉpend pas d'un rรฉsultat agrรฉgรฉ doit figurer dans WHERE plutรดt que dans HAVING.
