1. 什么是分组?

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

2. 创建分组

分组是在SELECT语句的GROUP BY子句中建立的,用法如下:

SELECT column1_name,column2_name FROM table GROUP BY column1_name
  • GROUP BY子句可以包含任意数目的列。
  • 如果在GROUP BY子句中列出的每个列都必须是检索列或者有效的表达式(但不能是聚集函数)
  • 如果GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总,也就是说,在建立分组的时候,指定的所有列都一起进行计算,所以不能从个别的列获取数据
  • 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
  • 如果分组中具有NULL值,则NULL值将作为一个分组返回
  • GROUP BY子句必须在WHERE子句之后,ORDER BY子句之前

使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,如下所示:

SELECT column1_name,column2_name FROM table GROUP BY column1_name WITH ROLLUP;

3. 过滤分组

使用HAVING子句来过滤分组。HAVING和WHERE非常类似,不过WHERE子句是过滤行,HAVING子句是过滤分组,用法如下:

SELECT column1_name,column2_name GROUP BY column1_name HAVING column1_name > 1;
  • WHERE在数据分组前进行过滤,而HAVING在数据分组后进行过滤
  • WHERE和HAVING可以一起使用

4. 分组和排序

ORDER BY 和 GROUP BY的差别

ORDER BY

GROUP BY

排序产生的输出

分组行,但顺序可能不是分组的顺序

任意列都可以使用,甚至非选择列都可以使用

只能使用选择列或者表达式列,而且必须使用每个选择列表达式

不一定需要

如果与聚集函数使用列(或表达式),则必须使用

5. SELECT子句顺序

子句

说明

是否必须使用

SELECT

要返回的列或表达式


FROM

从中检索数据的表

仅在从表选择数据时使用

WHERE

行级过滤


GROUP BY

分组说明

仅在按分组计算聚集时使用

HAVING

组级过滤


ORDER BY

输出排序顺序


LIMIT

要检索的行数