MySQL GROUP BY 分组语句用法详解与示例

Mysql 教程


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)

Mysql 教程


相关