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.

  • (I.e. Objectif principal : La fonction GROUP BY regroupe les lignes ayant des valeurs identiques et renvoie une seule ligne pour chaque รฉlรฉment regroupรฉ.
  • ๐Ÿงฉ Groupe ร  colonne uniqueping: Grouping Le tableau des membres par sexe rรฉduit neuf lignes ร  deux, une pour les femmes et une pour les hommes.
  • ๐Ÿ”— Groupe ร  colonnes multiplesping: Grouping Sur deux colonnes, une ligne est considรฉrรฉe comme unique lorsque l'une ou l'autre des valeurs diffรจre, de sorte que seuls les doublons exacts sont supprimรฉs.
  • ๐Ÿงฎ Appariement agrรฉgรฉ : COMPTE, SOMME, AVGLes fonctions MIN et MAX calculent une valeur par groupe, ce qui produit le rapport de synthรจse.
  • (I.e. AVOIR versus Oร™ : WHERE filtre les lignes avant le groupeping, HAVING filtre ensuite les groupes, et seul HAVING accepte les rรฉsultats agrรฉgรฉs.
  • โš ๏ธ Attention au mode strict : Sous ONLY_FULL_GROUP_BY, chaque colonne sรฉlectionnรฉe doit รชtre regroupรฉe ou encapsulรฉe dans une fonction d'agrรฉgation.

Clause SQL GROUP BY et HAVING

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.

FAQ

Oui. La clause GROUP BY, utilisรฉe seule, renvoie une ligne par valeur unique, ce qui รฉlimine les doublons de la mรชme maniรจre que SELECT DISTINCT. Les fonctions d'agrรฉgation ne sont nรฉcessaires que lorsque chaque groupe requiert un rรฉsultat calculรฉ.

L'erreur se produit lorsqu'une colonne sรฉlectionnรฉe n'est ni listรฉe dans GROUP BY ni incluse dans une fonction d'agrรฉgation. MySQL Le systรจme ne parvient pas ร  dรฉterminer quelle valeur de cette colonne afficher pour le groupe et refuse donc la requรชte.

COUNT(*) compte toutes les lignes du groupe. COUNT(colonne) compte uniquement les lignes oรน cette colonne n'est pas prรฉsente. NULLLes deux chiffres diffรจrent donc chaque fois que la colonne contient des valeurs manquantes.

Oui. Des assistants IA intรฉgrรฉs ร  des outils tels que MySQL Workbench Traduisez une requรชte telle que ยซ membres par sexe ยป en une requรชte groupรฉe. Vรฉrifiez le groupeping colonnes vous-mรชme, car un mauvais groupeping produit des totaux qui semblent plausibles mais qui sont incorrects.

Souvent, oui. Les assistants de requรชtes IA signalent les causes classiques telles queโ€ฆ INSCRIPTION qui multiplie les lignes avant le groupepingou un filtre placรฉ dans HAVING au lieu de WHERE. La dรฉcision finale revient toujours ร  la personne qui connaรฎt les donnรฉes.

Rรฉsumez cet article avec :