MySQL GROUP BY 分组语句用法详解与示例
MYSQL GROUP BY 子句用于从多条记录中收集数据并将结果按一列或多列分组。它通常用于 SELECT 语句。
您还可以在分组列上使用一些聚合函数,如 COUNT、SUM、MIN、MAX、AVG 等。
GROUP BY 语法
SELECT column_name1, column_name2……,aggregate_function(column_name)
FROM table_name
[WHERE conditions]
GROUP BY column_name1,column_name2……;
参数说明
column_name:指定显示的字段名称。
aggregate_function:它指定了一个函数,例如 SUM、COUNT、MIN、MAX 或 AVG 等。
table_name:它指定了要从中检索记录的表。FROM 子句中必须至少列出一个表。
WHERE conditions:可选项,指定要选择的记录必须满足的条件。
示例代码
本实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。
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,
`signin` 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', '小明', '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');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
导入成功后,执行以下 SQL 语句:
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)
带有 COUNT 函数的 MySQL GROUP BY 子句
接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> SELECT name, COUNT(*)
FROM employee_tbl
GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
带有 SUM 函数的 MySQL GROUP BY 子句
mysql> SELECT name, SUM(signin) as signin_count
-> FROM employee_tbl
-> GROUP BY name;
+--------+--------------+
| name | signin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
+--------+--------------+
3 rows in set (0.00 sec)
带有 MIN 函数的 MySQL GROUP BY 子句
以下示例显示每个人最小次数的登录记录。
mysql> SELECT name, MIN(signin) as minsign
FROM employee_tbl
GROUP BY name;
+--------+---------+
| name | minsign |
+--------+---------+
| 小丽 | 2 |
| 小明 | 1 |
| 小王 | 3 |
+--------+---------+
3 rows in set (0.00 sec)
带有 MAX 函数的 MySQL GROUP BY 子句
以下示例显示每个人最大次数的登录记录。
mysql> SELECT name, MAX(signin) as maxsign
FROM employee_tbl
GROUP BY name;
+--------+---------+
| name | maxsign |
+--------+---------+
| 小丽 | 2 |
| 小明 | 4 |
| 小王 | 4 |
+--------+---------+
3 rows in set (0.00 sec)
带有 AVG 函数的 MySQL GROUP BY 子句
以下示例显示每个人登录次数的平均值。
mysql> SELECT name, AVG(signin) as avgsign
FROM employee_tbl
GROUP BY name;
+--------+---------+
| name | avgsign |
+--------+---------+
| 小丽 | 2.0000 |
| 小明 | 2.3333 |
| 小王 | 3.5000 |
+--------+---------+
3 rows in set (0.00 sec)