HAVING 子句可以在没有 GROUP BY 子句的情况下使用吗?
SQL 标准概述了使用 HAVING 子句的具体标准,其中包括引用功能上依赖于 GROUP BY 子句或外部引用的列。然而,所提供的查询提出了是否可以在没有 GROUP BY 的情况下使用 HAVING 的问题。
标准 SQL 规范
根据标准,不带 GROUP BY 的 HAVING 子句没有明确禁止 GROUP BY 子句。但是,该查询表现出可疑的行为:
SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)
此查询在 HAVING 子句中使用聚合函数 (MAX),但它不指示应选择哪个特定行。因此,它的行为并没有严格由标准定义。
MySQL 实现
MySQL 将此查询解释为好像存在隐式 GROUP BY 子句,仅选择行具有最大 NumberOfPages 值。此行为不符合标准。
不符合标准的原因
标准要求 HAVING 子句对 GROUP BY 子句定义的行组进行操作。其目的是根据聚合值过滤掉组。使用不带 GROUP BY 的 HAVING 会允许对任意条件进行过滤,可能会导致意外结果。
有效的标准 SQL 查询
使用不带 GROUP BY 的 HAVING 的有效标准 SQL 查询将为:
SELECT 'T' AS result FROM Book HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
此查询检查最小 NumberOfPages 值是否小于最大值值,如果为 true,则返回结果为“T”的单行;如果为 false,则返回空集。此行为符合 HAVING 适用于在整个表上操作的聚合函数的标准要求。
以上是可以在没有 GROUP BY 子句的 SQL 中使用 HAVING 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!