分组函数
从上一课得知,使用SQL聚集函数可以汇总数据。这样,我们就能够对行进行计数,计算和平均数,不检索所有数据排序就获得最大值和最小值。
我们数了全国有几个城市,但是每个省的城市数怎么统计呢?因此需要使用分组函数进行聚集计算
输入:
SELECT
province_name,
count(distinct city_name)
from dw.dim_city
group by province_name
keys:
1、GROUP BY子句可以包含任意数目的列。
2、GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。
3、如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
4、除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
5、如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
6、GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
过滤分组
除了能用GROUP BY分组数据外,SQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,你可能想要列出至少有10个城市的所有省。为此,必须基于完整的分组而不是个别的行进行过滤。
我们已经看到了WHERE子句的作用(之前课提及)。但是,在这个例子中WHERE不能完成任务,因为WHERE过滤指定的是行而不是分组。事实 ,WHERE没有分组的概念。 那么,不使用WHERE使用什么呢?
SQL为此提供了另一个子句,就是HAVING子句。HAVING非常类似于WHERE。事实上,目前为止所学过的所有类 型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。
↑ where zhibiao2=6(原表里面筛选)
↑ having sum(zhibiao2)=6(分组求和后的结果筛选)
输入:
SELECT province_name,
count(distinct city_name)
from dw.dim_city
GROUP BY province_name
having count(distinct city_name)>=10
分组后排序
输入:
SELECT province_name,
count(distinct city_name) city_num
from dw.dim_city
GROUP BY province_name
having count(distinct city_name)>=10
order by city_num desc
输入:
SELECT province_name,
count(distinct city_name) city_num
from dw.dim_city
GROUP BY province_name
having count(distinct city_name)>=10
order by count(distinct city_name) desc
keys:
1、分组后排序可用聚合函数或命名(复习:group by不能带命名)
SELECT子句执行说明
| 子 句 | 说 明 | 是否必须使用 |
|---|---|---|
| SELECT | 要返回的列或表达式 | 是 |
| FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
| WHERE | 行级过滤 | 否 |
| GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
| HAVING | 组级过滤 | 否 |
| ORDER BY | 输出排序顺序 | 否 |
