在本文中,树懒君将介绍MySQL是怎样进行数据分组的,分组的目的在于将表内容的子集进行汇总。这涉及到了2个SELECT子句,分别是GROUP BY和HAVING;分组能够将一个整表分为不同的逻辑组,来对每个逻辑组进行聚合操作。
一、什么是MySQL分组?
在MySQL查询语句中,可以利用GROUP BY子句,将結果集中的数据行依据选定的列的值进行逻辑分组,然后将表中数据的子集进行汇总,以此来实现对逻辑组而不是整张表的整合。
加下来树懒君来介绍一下分组查询的语法:
二、MySQL分组语法(GROUP BY)
GROUP BY { | | } [ASC | DESC] }
具体说明如下:
:选定用以分组的列。能够选定不同的多个列,彼此之间用逗号隔开。
:指明分组的关系式。一般与聚合函数一起应用,比如可将关系式COUNT(*) AS ‘总数’做为查询列表目录的一项。
:选定分组的列在查询結果集的位置,一般是一个正整数。比如,GROUPBY 2表明根据查询明细上的第2列的值开展逻辑分组。
ASC|DESC:关键词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子句的使用,必须注意以下几个方面:
GROUP BY子句能够包括随意数量的列,使其能够对分组开展嵌套,对数据分组进行更为细腻的控制。
GROUP BY子句列举的每一个列都必须是检索列或有效表达式,但不可以是聚合函数。
三、过虑分组(HAVING)
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的不同:
where在分组之前进行限制,如果不符合条件,则不进行分组;
having是在分组之后进行限制,假如不符合条件,则不会被查询到结果集;
where后边不能跟聚合函数,而having可以通过聚合函数进行判断。
四、MySQL分组的注意点:
在单表分组查寻中,所有不是分组函数的查询字段都要出现在group by子句之后,顺序不影响查询结果。
通常情况下,分组前的数据筛选时放到where子句中,分组后的数据筛选时放到having子句中,但分组后筛选数据的条件是表的字段时,可以放到where子句中(且这时高效率高些)。
where中不可以使用分组函数,因而有这么一个技巧:只要筛选条件时表中字段就放到where子句中,不然放到having子句中。
orderby子句、groupby子句和having子句都适用别称。