分组函数
    从上一课得知,使用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 输出排序顺序