数据库如何把数据分组?MySQL分组语法详解


在本文中,树懒君将介绍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的不同:

  1. where在分组之前进行限制,如果不符合条件,则不进行分组;
  2. having是在分组之后进行限制,假如不符合条件,则不会被查询到结果集;
  3. where后边不能跟聚合函数,而having可以通过聚合函数进行判断。

四、MySQL分组的注意点:

  • 在单表分组查寻中,所有不是分组函数的查询字段都要出现在group by子句之后,顺序不影响查询结果。
  • 通常情况下,分组前的数据筛选时放到where子句中,分组后的数据筛选时放到having子句中,但分组后筛选数据的条件是表的字段时,可以放到where子句中(且这时高效率高些)。
  • where中不可以使用分组函数,因而有这么一个技巧:只要筛选条件时表中字段就放到where子句中,不然放到having子句中。
  • orderby子句、groupby子句和having子句都适用别称。