创建分组
分组是在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;