SELECT *
FROM Book
HAVING NumberOfPages = MAX(NumberOfPages)
以下是标准中的内容:
HAVING <search condition>
- 设G是由<group by clause>中包含的<column reference>引用的每一列组成的集合.
- 直接包含在<search condition>中的每个列引用应为以下之一:
- 对功能上依赖于G的列的明确引用.
- 外部参考.
有人可以解释一下,为什么按照标准应该可行?
在MySQL中,它非常有效.
one*_*hen 21
尽管有Mimer Validator结果,但我不相信你的有效标准SQL.
没有HAVING子句的GROUP BY子句在标准SQL中是有效的(可以说是)有用的语法.因为它作为一个集合一起操作表表达式,所以可以说,使用聚合函数才真正有意义.在你的例子中:
Book HAVING NumberOfPages = MAX(NumberOfPages)
Run Code Online (Sandbox Code Playgroud)
是无效的,因为在考虑整个表时,哪一行确实NumberOfPages引用?同样,只在SELECT子句中使用文字值才有意义.
考虑这个有效的标准SQL示例:
SELECT 'T' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
Run Code Online (Sandbox Code Playgroud)
尽管没有DISTINCT关键字,查询将永远不会返回多行.如果HAVING满足该子句,那么结果将是一行,其中一列包含值'T'(表示我们有不同页数的书),否则结果将是空集,即单行的零行.
我认为查询在mySQL中没有错误的原因是由于有利的扩展导致HAVING子句(逻辑上)在SELECT子句之后出现(标准行为是另一种方式),再加上GROUP BY其他提到的隐式子句答案.
小智 12
“当不使用 GROUP BY 时,HAVING 的行为就像一个 WHERE 子句。” where 和 have 的区别:WHERE 过滤 ROWS 而 HAVING 过滤组
SELECT SUM(spending) as totSpending
FROM militaryspending
HAVING SUM(spending) > 200000;
Run Code Online (Sandbox Code Playgroud)
结果
totSpending
1699154.3
Run Code Online (Sandbox Code Playgroud)
更详细请参考 https://dba.stackexchange.com/questions/57445/use-of-have-without-group-by-in-sql-queries/57453
来自标准(粗体来自强调)
\n\n1) 设HC为having子句。令 TE 为直接包含 HC 的表表达式。如果 TE 不立即包含 group by 子句,则 \xe2\x80\x9cGROUP BY ()\xe2\x80\x9d 是隐式的。令 T 为由直接包含在 TE 中的 GBC 定义的表的描述符,并令 R 为 GBC 的结果。
\n\n通过隐式的group by子句,外部引用可以访问TE列。
\n\n然而,如今这些标准的认证在很大程度上是一种自我认证,您给出的示例并不适用于所有主要的 RDBMS 提供商。
\n