English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
The GROUP BY statement groups the result set based on one or more columns.
On the columns grouped by, we can use functions such as COUNT, SUM, AVG, etc.
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
This chapter example uses the following table structure and data, we can import the following data into the database before using it.
SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `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, `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `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;
导入成功后,执行以下 SQL 语句:
mysql> set names utf8; mysql> SELECT * FROM employee_tbl; +----+--------+---------------------+--------+ | id | name | date | date | singin | +----+--------+---------------------+--------+ | 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 | +----+--------+---------------------+--------+ 6 rows in set (0.00 sec)
接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; +--------+----------+ | name | COUNT(*) | +--------+----------+ | Xiao Li | 1 | | Xiao Ming | 3 | | Xiao Wang | 2 | +--------+----------+ 3 filas en conjunto (0.01 sec)
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM, AVG, COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
mysql> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------+--------------+ | name | singin_count | +--------+--------------+ | Xiao Li | 2 | | Xiao Ming | 7 | | Xiao Wang | 7 | | NULL | 16 | +--------+--------------+ 4 rows in set (0.00 sec)
Donde el registro NULL representa el número de veces que todos los usuarios se han conectado.
Podemos usar coalesce para establecer un nombre que reemplace a NULL, sintaxis de coalesce:
select coalesce(a,b,c);
Descripción de los parámetros: si a==null, selecciona b; si b==null, selecciona c; si a!=null, selecciona a; si a, b, c todos son null, devuelve null (sin sentido).
En el siguiente ejemplo, si el nombre está vacío, utilizamos el total en su lugar:
mysql> SELECT coalesce(name, 'Total'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------------------------+--------------+ | coalesce(name, 'Total') | singin_count | +--------------------------+--------------+ | Pequeña Li | 2 | | Pequeño Xiao | 7 | | Pequeño Wang | 7 | | Total | 16 | +--------------------------+--------------+ 4 filas en conjunto (0.01 sec)