在本文中,树懒君将介绍MySQL是怎样进行数据分组的,分组的目的在于将表内容的子集进行汇总。这涉及到了2个SELECT子句,分别是GROUP BY和HAVING;分组能够将一个整表分为不同的逻辑组,来对每个逻辑组进行聚合操作。
在MySQL查询语句中,可以利用GROUP BY子句,将结果集中的数据行依据选定的列的值进行逻辑分组,然后将表中数据的子集进行汇总,以此来实现对逻辑组而不是整张表的整合。
加下来树懒君来介绍一下分组查询的语法:
GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC] }
具体说明如下:
示例:
mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | singin |
+----+--------+---------------------+--------+
| 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)
这里树懒君通过GROUP BY语句将数据表按姓名开展分组,并统计每一个人有多少条纪录:
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
对于GROUP BY子句的使用,必须注意以下几个方面:
MySQL容许过虑分组,用户可以指定结果集包含什么分组,清除什么分组。过滤分组选用HAVING子句来实现。
在SQL中加入HAVING子句的原因在于,WHERE关键字没法与聚合函数一起使用。HAVING子句能够帮助我们筛选分组后的每组数据。
HAVING 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
下面树懒君给大家介绍一下where和having的不同:
分组操作演示可点击《MySQL分组》查看。