Clause SQL GROUP BY et HAVING avec exemples
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 valeurs. La clause GROUP BY est utilisée dans l'instruction SELECT. En option, il est utilisé conjointement avec des fonctions d'agrégation pour produire des rapports récapitulatifs à partir de la base de données.
C'est ce que ça fait, résumer les données de la base de données.
Les requêtes qui contiennent la clause GROUP BY sont appelées requêtes groupées et ne renvoient qu'une seule ligne pour chaque élément groupé.
Syntaxe SQL GROUP BY
Maintenant que nous savons ce qu'est la clause SQL GROUP BY, examinons la syntaxe d'une requête group by de base.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
ICI
- « Instructions SELECT… » est la requête de commande SQL SELECT standard.
- "PAR GROUPE nom_colonne1» est la clause qui effectue le regroupement en fonction de column_name1.
- « [,column_name2,…] » est facultatif ; représente d'autres noms de colonnes lorsque le regroupement est effectué sur plusieurs colonnes.
- « [HAVING condition] » est facultatif ; il est utilisé pour restreindre les lignes affectées par la clause GROUP BY. C'est semblable au clause O.
Regroupement à l'aide d'un Colonne unique
Afin de mieux comprendre l'effet de la clause SQL Group By, exécutons une requête simple qui renvoie toutes les entrées de sexe de la table des membres.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Supposons que nous souhaitions obtenir les valeurs uniques pour les genres. Nous pouvons utiliser une requête suivante –
SELECT `gender` FROM `members` GROUP BY `gender`;
Exécuter le script ci-dessus dans MySQL établi contre Myflixdb nous donne les résultats suivants.
gender |
---|
Female |
Male |
Notez que seuls deux résultats ont été renvoyés. C'est parce que nous n'avons que deux types de genre, masculin et féminin. La clause GROUP BY dans SQL regroupait tous les membres « mâles » et ne renvoyait qu'une seule ligne pour cela. Il a fait la même chose avec les membres « féminins ».
Regroupement à l'aide plusieurs colonnes
Supposons que nous souhaitions obtenir une liste des filmscategory_id et des années correspondantes au cours desquelles ils sont sortis.
Observons le résultat de cette simple requête
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Le résultat ci-dessus comporte de nombreux doublons.
Exécutons la même requête en utilisant group by dans SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Exécuter le script ci-dessus dans MySQL L'établi contre myflixdb nous donne les résultats suivants indiqués ci-dessous.
category_id | year_released |
---|---|
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 l'identifiant de catégorie et l'année de publication pour identifier au design lignes dans notre exemple ci-dessus.
Si l'identifiant de catégorie est le même mais que l'année de sortie est différente, alors une ligne est traitée comme une ligne unique. Si l'identifiant de catégorie et l'année de sortie sont les mêmes pour plusieurs lignes, alors elle est considérée comme un doublon et une seule ligne. est montré.
Regroupement et fonctions d'agrégation
Supposons que nous souhaitions le nombre total d'hommes et de femmes dans notre base de données. Nous pouvons utiliser le script suivant ci-dessous pour ce faire.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Exécuter le script ci-dessus dans MySQL Le workbench contre myflixdb nous donne les résultats suivants.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Les résultats affichés ci-dessous sont regroupés en fonction de chaque valeur de sexe unique publiée et le nombre de lignes groupées est compté à l'aide de la fonction d'agrégation COUNT.
Restreindre les résultats d'une requête à l'aide de AYANT qui les aurait exempté de leurs obligations si des circonstances hors de leur contrôle les empêchaient de produire le grain sous contrat.
Nous ne souhaitons pas toujours effectuer des regroupements sur toutes les données d'un tableau donné. Il y aura des moments où nous souhaiterons limiter nos résultats à certains critères donnés. Dans de tels cas, nous pouvons utiliser la clause HAVING
Supposons que nous souhaitions connaître toutes les années de sortie pour la catégorie de film 8. Nous utiliserions le script suivant pour obtenir nos résultats.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Exécuter le script ci-dessus dans MySQL L'établi contre Myflixdb nous donne les résultats suivants présentés ci-dessous.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Notez que seuls les films avec l'identifiant de catégorie 8 ont été concernés par notre clause GROUP BY.
Résumé
- La clause GROUP BY SQL est utilisée pour regrouper les lignes avec les mêmes valeurs.
- La clause GROUP BY est utilisée avec le Instruction SQL SELECT.
- L'instruction SELECT utilisée dans la clause GROUP BY ne peut contenir que des noms de colonnes, des fonctions d'agrégation, des constantes et des expressions.
- La clause SQL Have est utilisée pour restreindre les résultats renvoyés par la clause GROUP BY.
- La clause MYSQL GROUP BY est utilisée pour collecter des données à partir de plusieurs enregistrements et des enregistrements renvoyés par une ou plusieurs colonnes.