Instruction GROUP BY de MySQL
L'instruction GROUP BY regroupe l'ensemble de résultats par une ou plusieurs colonnes.
Sur les colonnes groupées, on peut utiliser des fonctions telles que COUNT, SUM, AVG, etc.
L'instruction GROUP BY est un outil important dans les requêtes SQL pour résumer et analyser les données. Surtout lorsqu'on traite de grandes quantités de données, elle peut fournir des informations récapitulatives utiles.
Syntaxe de GROUP BY
SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1;
column1: spécifie la ou les colonnes à regrouper.aggregate_function(column2): fonction(s) d'agrégation exécutée(s) sur chaque groupe après regroupement.table_name: le nom de la table à interroger.condition: facultatif, la condition utilisée pour filtrer les résultats.
Supposons qu'il existe une table nommée orders contenant les colonnes suivantes :order_id, customer_id, order_date et order_amount。
Nous voulons regrouper par customer_id et calculer le montant total des commandes pour chaque client. L'instruction SQL est la suivante :
Exemple
FROM orders
GROUP BY customer_id;
Dans l'exemple ci-dessus, nous utilisons GROUP BY customer_id pour regrouper les résultats par la colonne customer_id, puis utilisons SUM(order_amount) pour calculer la somme de la colonne order_amount dans chaque groupe.
AS total_amount est utilisé pour donner un alias au résultat du calcul, ce qui rend le résultat de la requête plus facile à lire.
Notes :
GROUP BYLa clause est généralement utilisée avec les fonctions d'agrégation, car après le regroupement, des opérations d'agrégation doivent être effectuées sur chaque groupe.SELECTLes colonnes de la clause sont généralement soit des colonnes de regroupement, soit des arguments de fonctions d'agrégation.- Plusieurs colonnes peuvent être utilisées pour le regroupement ; il suffit, dans la
GROUP BYclause, de séparer les noms de colonnes par des virgules.
Exemple
FROM TABLE_NAME
WHERE condition
GROUP BY column1, column2;
Démonstration d'exemple
Les exemples de ce chapitre utilisent la structure de table et les données suivantes. Avant de les utiliser, nous pouvons d'abord importer les données suivantes dans la base de données.
Exemple
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Structure de table pour `employee_tbl`
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
`id` INT(11) NOT NULL,
`name` CHAR(10) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Nombre de connexions',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Enregistrements de `employee_tbl`
-- ----------------------------
BEGIN;
INSERT INTO `employee_tbl` VALUES ('1', 'Xiao Ming', '2016-04-22 15:25:33', '1'), ('2', 'Xiao Wang', '2016-04-20 15:25:47', '3'), ('3', 'Xiao Li', '2016-04-19 15:26:02', '2'), ('4', 'Xiao Wang', '2016-04-07 15:26:14', '4'), ('5', 'Xiao Ming', '2016-04-11 15:26:40', '4'), ('6', 'Xiao Ming', '2016-04-04 15:26:54', '2');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
Après un import réussi, exécutez l'instruction SQL suivante :
mysql> set names utf8; mysql> SELECT * FROM employee_tbl; +----+--------+---------------------+--------+ | id | name | date | signin | +----+--------+---------------------+--------+ | 1 | 小明 | 2016-04-22 15:25:33 | 1 | | 2 | 小王 | 2016-04-20 15:25:47 | 3 | | 3 | 小丽 | 2016-04-19 15:26:02 | 2 | | 4 | 小王 | 2016-04-07 15:26:14 | 4 | | 5 | 小明 | 2016-04-11 15:26:40 | 4 | | 6 | 小明 | 2016-04-04 15:26:54 | 2 | +----+--------+---------------------+--------+ 6 rows in set (0.00 sec)
Ensuite, nous utilisons l'instruction GROUP BY pour regrouper la table de données par nom, et compter combien d'enregistrements chaque personne possède :
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; +--------+----------+ | name | COUNT(*) | +--------+----------+ | 小丽 | 1 | | 小明 | 3 | | 小王 | 2 | +--------+----------+ 3 rows in set (0.01 sec)
Utilisation de WITH ROLLUP
WITH ROLLUP peut effectuer les mêmes statistiques (SUM, AVG, COUNT…) sur la base des statistiques groupées.
Par exemple, nous regroupons la table de données ci-dessus par nom, puis comptons le nombre de connexions pour chaque personne :
mysql> SELECT name, SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------+--------------+ | name | signin_count | +--------+--------------+ | 小丽 | 2 | | 小明 | 7 | | 小王 | 7 | | NULL | 16 | +--------+--------------+ 4 rows in set (0.00 sec)
L'enregistrement avec NULL représente le nombre total de connexions pour toutes les personnes.
Nous pouvons utiliser coalesce pour définir un nom qui peut remplacer NULL. La syntaxe de coalesce est :
select coalesce(a,b,c);
Description des paramètres : si a==null, choisir b ; si b==null, choisir c ; si a!=null, choisir a ; si a, b, c sont tous null, alors renvoyer null (sans signification).
Dans l'exemple suivant, si le nom est vide, nous utilisons plutôt le total :
mysql> SELECT coalesce(name, '总数'), SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------------------------+--------------+ | coalesce(name, '总数') | signin_count | +--------------------------+--------------+ | 小丽 | 2 | | 小明 | 7 | | 小王 | 7 | | 总数 | 16 | +--------------------------+--------------+ 4 rows in set (0.01 sec)Autres extensions