创建分组

分组是在SELECT语句的GROUP BY子句中建立的,经常与聚集函数一同使用。

1、GROUP BY子句可以包含任意数目的列。

2、如果在GROUP BY子句中嵌套分组,数据将在最后规定的分组上进行汇总(在建立分组时,指定的所有列都一起计算,即:不能从个别的列取回数据)。

3、GROUP BY子句中列出的每个列都必须是检索列或有效的表达式,但不能是聚集函数(AVG()、COUNT()等函数)。

4、除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

5、如果分组列中具有NULL值,则NULL将作为一个分组返回。如果有多行NULL值,他们将分为一组。

6、GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

7、使用WITH ROLLUP关键字们可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。

 语法举例:

统计 city表中  CountryCode列 中每个值出现的次数

SELECT CountryCode,COUNT(*)
FROM city
GROUP BY CountryCode;

过滤分组

使用HAVING子句进行分组过滤,HAVING子句非常类似WHERE子句,事实上,基本上所有类型的WHERE子句都可以使用HAVING子句来代替,并且HAVING子句支持所有WHERE操作符。

HAVING和WHERE的差别:WHERE子句过滤行,HAVING子句过滤分组,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤,WHERE排除的行不包括在分组中,这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

HAVING 子句一般出现在GROUP BY 子句之后。

语法举例:

统计 city表中  CountryCode列 中每个值出现次数大于2的结果

SELECT CountryCode,COUNT(*)
FROM city
GROUP BY CountryCode
HAVING COUNT(*) > 2;

分组和排序

ORDER BY 是排序产生的输出,任意列都可以使用(设置是非选择的列也可以使用),在某些情况下不一定需要该子句(不需要排序的时候)。

GROUP BY 是分组行,但是输出可能不是分组的顺序(要根据数据的输入情况决定),只可能使用选择列回表达式列么热切必须使用每个选择列表达式,如果与聚集函数一起使用列或表达式则必须使用group by子句。

注意:不要仅依赖于group by排序数据,在排序数据时应该使用 order by子句。

语法举例:

统计 city表中  CountryCode列 中每个值出现次数大于2的结果,输出结果按照CountryCode列值进行降序排序

SELECT CountryCode,COUNT(*)
FROM city
GROUP BY CountryCode
HAVING COUNT(*)>2
ORDER BY CountryCode DESC;