在标准 SQL 中,是否可以使用不带 GROUP BY 子句的 HAVING 子句?
问题1:标准SQL合规性
提供的示例查询:
SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)
与 SQL 标准相矛盾。根据标准,HAVING 子句中的所有列引用必须引用功能上依赖于 GROUP BY 子句中指定的列集的列。然而,该查询缺少 GROUP BY 子句,使其不标准。
问题 2:MySQL 兼容性
该查询仅在特定条件下在 MySQL 中工作,其中结果的第一行包含 NumberOfPages 的最大值。此行为可能是由于 MySQL 在没有 GROUP BY 子句的情况下处理 HAVING 子句所致。
问题 3:标准 SQL 合理性
标准禁止不带 GROUP 的 HAVING 子句BY 子句,因为它们在指定哪些行满足 HAVING 条件时会产生歧义。对于作为整体考虑的表表达式,没有选择特定行与聚合函数进行比较的逻辑基础。
有效标准 SQL 查询的示例:
此查询演示了不带 GROUP BY 子句的 HAVING 子句的有效使用:
SELECT 'T' AS result FROM Book HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
查询始终返回值为“T”的单行(表示页数不同的书籍)或空集(无行)。
结论:
虽然样本查询在MySQL中工作,它不符合标准SQL。标准 SQL 禁止使用没有 GROUP BY 子句的 HAVING 子句,以避免歧义并确保逻辑一致性。
以上是在 SQL 中可以使用 HAVING 而不使用 GROUP BY 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!