分组数据
数据分组
使用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子句及其顺序
网友评论