zoukankan      html  css  js  c++  java
  • 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 输出排序顺序
  • 相关阅读:
    使用CTE分页 在MSSQL2005上可以使用
    uc_client目录
    用SQL语句添加删除修改字段
    for all your mad scientific needs think geek
    C++:Prototype模式去掉Clone方法
    linux命令:top
    linux命令:time
    C++:运行期断言和编译期断言
    内核分析:EXPORT_SYMBOL解析
    Linux工具:使用SED编辑器
  • 原文地址:https://www.cnblogs.com/bien94/p/12862229.html
Copyright © 2011-2022 走看看