美文网首页
SQL必知必会读书笔记10

SQL必知必会读书笔记10

作者: surrealtire | 来源:发表于2020-02-17 01:45 被阅读0次

    分组数据

    数据分组

    使用SQL聚集函数可以汇总数据,这样我们就能够不检索所有数据就获得最大值和最小值。通过分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

    实操:SELECT zhanghu,COUNT(*) AS '流水数量' FROM gjp_zhangwu GROUP BY zhanghu;

    结果如下:

    GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。

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

    GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY 子句中指定相同的表达式。不能使用别名。

    大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。

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

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

    GROUP BY 子句必须出现在WHERE子句知乎,ORDER BY 子句之前。

    通过相对位置指定列

    有的SQL实现允许根据SELECT列表中的位置指定GROUP BY 的列。

    实操:SELECT zhanghu,COUNT(*) AS '流水数量' FROM gjp_zhangwu GROUP BY 1;

    结果如下,和上次结果相同

    过滤分组

    使用HAVING子句,HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。

    实操:SELECT zhanghu,COUNT(*) AS '流水数量大于3的' FROM gjp_zhangwu GROUP BY 1 HAVING COUNT(*)>3;

    结果如下

    HAVING和WHERE的差别

    这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这里一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

    HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待他们。不过,你自己要能区分这一点。使用HAVING时应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。

    分组和排序

    GROUP BY 和ORDER BY 经常完成相同的工作,但热门非常不同,理解这一点很重要。

    ORDER BY 与GROUP BY

    实操:SELECT zhanghu,COUNT(*) AS '流水数量大于3的' FROM gjp_zhangwu GROUP BY 1 HAVING COUNT(*)>3 ORDER BY zhanghu;

    结果如下:

    SELECT子句及其顺序

    SELECT子句及其顺序

    相关文章

      网友评论

          本文标题:SQL必知必会读书笔记10

          本文链接:https://www.haomeiwen.com/subject/vmiufhtx.html