没有GROUP BY的情况

Adi*_*Adi 27 sql

  1. 根据标准(!)SQL,以下是否可行?
  2. 为了符合标准(如果还没有),应该进行哪些微小的改变?
  3. 如果第一行具有NumberOfPages的最大值,它在MySQL中可以正常工作.

SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)

以下是标准中的内容:

HAVING <search condition>

  • 设G是由<group by clause>中包含的<column reference>引用的每一列组成的集合.
  • 直接包含在<search condition>中的每个列引用应为以下之一:
    1. 对功能上依赖于G的列的明确引用.
    2. 外部参考.

资源

有人可以解释一下,为什么按照标准应该可行

在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


And*_*rew 5

来自标准(粗体来自强调)

\n\n

1) 设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