【问题标题】:HAVING without GROUP BY没有 GROUP BY
【发布时间】:2011-08-03 10:15:55
【问题描述】:
  1. 根据标准 (!) SQL 是否可以执行以下操作?
  2. 为了符合标准(如果尚未符合标准),应进行哪些最小更改?
  3. 如果第一行具有 NumberOfPages 的最大值,则它在 MySQL 中按预期工作。

SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)

标准中写了以下内容:

HAVING <search condition>

  • 令 G 为由 中包含的 引用的每一列组成的集合。
  • 中直接包含的每个列引用应为以下之一:
    1. 对在功能上依赖于 G 的列的明确引用。
    2. 外部参考。

source

谁能解释一下,为什么按标准it should be possible

在 MySQL 中,它可以完美运行。

【问题讨论】:

  • 你在其他什么数据库中尝试它? Oracle、MSSQL 等?

标签: sql


【解决方案1】:

“当不使用 GROUP BY 时,HAVING 的行为类似于 WHERE 子句。” where和have的区别:WHERE过滤ROWS,HAVING过滤组

SELECT SUM(spending) as totSpending
FROM militaryspending
HAVING SUM(spending) > 200000;

结果

totSpending
1699154.3

更多详情,请咨询 https://dba.stackexchange.com/questions/57445/use-of-having-without-group-by-in-sql-queries/57453

【讨论】:

    【解决方案2】:

    尽管有Mimer Validator 的结果,但我认为您的结果不是有效的标准 SQL。

    没有GROUP BY 子句的HAVING 子句在标准SQL 中是有效且(可以说)有用的语法。因为它作为一个集合一次性对表表达式进行操作,所以可以说,只有使用聚合函数才真正有意义。在您的示例中:

    Book HAVING NumberOfPages = MAX(NumberOfPages)
    

    无效,因为在考虑整个表时,NumberOfPages 指的是哪一行?同样,只有在 SELECT 子句中使用文字值才有意义。

    考虑这个例子,它是有效的标准 SQL:

     SELECT 'T' AS result
       FROM Book
     HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
    

    尽管没有DISTINCT 关键字,但查询永远不会返回超过一行。如果满足HAVING 子句,则结果将是单行,单列包含值“T”(表示我们有不同页数的书),否则结果将是空集,即零行单列。

    我认为查询在 mySQL 中没有出错的原因是由于专有扩展导致 HAVING 子句(逻辑上)在 SELECT 子句之后出现(标准行为是相反的) ,再加上其他答案中提到的隐式 GROUP BY 子句。

    【讨论】:

      【解决方案3】:

      来自标准(强调加粗)

      1) 设 HC 为 having 子句。令 TE 为直接包含 HC 的表表达式。 如果 TE 没有立即包含 group by 子句,则“GROUP BY ()”是隐含的。 设 T 为 由 GBC 定义的表的描述符立即包含在 TE 中,令 R 为 GBC的结果。

      通过隐式 group by 子句,外部引用可以访问 TE 列。

      但是,这些标准的认证如今在很大程度上是一种自我认证,您提供的示例不适用于所有主要的 RDBMS 提供商。

      【讨论】:

        【解决方案4】:

        是的,我们可以编写不使用 Group by 的 SQL 查询,但编写聚合函数 在我们的查询中。

        select sum(Salary) from ibs having max(Salary)>1000
        

        【讨论】:

          猜你喜欢
          • 2011-09-01
          • 2021-04-01
          • 2021-01-09
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多