SQL中GROUP BY子句相关约束

  一、分组数据是在SELECT语句中使用GROUP BY子句来实现的。下面说说它的一些重要规定:

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

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

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

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

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

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

  (7)GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

  (8)某些DBMS对SQL的实现,在GROUP BY中支持可选的ALL子句,这个子句可用来返回所有分组,即使是没有匹配行的分组也返回,此时聚集将返回NULL。

  (9)有的SQL实现允许根据SELECT列表中的位置指定GROUP BY的列,例如,GROUP BY 1,2可表示按选择的第一个列分组,然后再按第二个列分组。

  (10)通过HAVING子句实现过滤分组。

  二、HAVING与WHERE的差别

HAVING WHERE
过滤分组 过滤行,WHERE没有分组的概念
在数据分组后进行过滤 在数据分组前进行过滤
使用HAVING子句时应该结合GROUP BY子句 WHERE子句用于标准的行级过滤
HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。
HAVING支持所有WHERE操作符,WHERE所有技术和选项都是用于HAVING,句法相同
所有类型的WHERE子句都可以用HAVING来替代

  三、ORDER BY与GROUP BY的差别

ORDER BY GROUP BY
对产生的输出排序 对行分组,但输出可能不是分组的排序
任意列都可以使用,甚至非选择的列也可以使用 只可能使用选择列或表达式,而且必须使用每个选择列或表达式
不一定需要 如果与聚集函数一起使用列(或表达式),则必须使用

  四、SELECT子句顺序

子句 说明 是否必须使用
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤
ORDR BY 输出排序顺序

 

上一篇:软件测试常见面试题


下一篇:数据库基础知识2