【问题标题】:It's possible to have a WHERE clause after a HAVING clause?在 HAVING 子句之后可以有 WHERE 子句吗?
【发布时间】:2010-12-12 22:04:05
【问题描述】:

可以在 HAVING 子句之后使用 WHERE 子句吗?

我首先想到的是子查询,但我不确定。

附:如果答案是肯定的,你能举一些例子吗?

【问题讨论】:

  • 这是一个技巧/面试问题,还是你有真正的问题要解决?
  • 是的。问题来自采访。

标签: sql where having


【解决方案1】:

HAVING 子句只是 GROUP BY 之后的 WHERE 子句。为什么不将 WHERE 条件放在 HAVING 子句中?

【讨论】:

  • 从概念上讲,HAVING 子句在 GROUP BY 操作之后应用,而 WHERE 子句在之前应用,因此理论上可以通过 WHERE 子句中的“过滤”进行优化。在实践中,您将(一如既往)必须查看优化器如何处理它,例如检查执行计划。还要考虑人类读者,他们通常希望在 WHERE 子句(而不是连接子句、HAVING 子句等)中看到“过滤”。
【解决方案2】:

来自 SELECT 帮助

WHERE、GROUP BY的处理顺序, 和 HAVING 子句的以下步骤 显示 SELECT 的处理顺序 带有 WHERE 子句、GROUP 的语句 BY 子句和 HAVING 子句:

FROM 子句返回一个初始值 结果集。

WHERE 子句不包括行 满足其搜索条件。

GROUP BY 子句收集 将选定的行分成一组,每个 GROUP BY 子句中的唯一值。

中指定的聚合函数 选择列表计算汇总值 每个组。

另外的 HAVING 子句 排除不符合其搜索的行 条件。

所以,不,你不能。

【讨论】:

    【解决方案3】:

    如果这是一个技巧问题,则可能是 WHERE 和 HAVING 不在同一级别,正如您提到的,子查询。

    我想这样的事情会起作用

    HAVING value=(SELECT max(value) FROM foo WHERE crit=123)

    ps:你为什么要问? 您有具体问题吗?

    p.s.s:好吧,傻我,我错过了“interview*”标签...

    【讨论】:

      【解决方案4】:

      不,不在同一个查询中。

      where 子句位于havinggroup by 之前。如果你想在分组之前过滤掉记录,条件放在where子句中,如果你想过滤掉分组记录,条件放在having子句中:

      select ...
      from ...
      where ...
      group by ...
      having ...
      

      如果由于某种奇怪的原因这两个都不能使用,您必须使查询成为子查询,以便您可以将where 子句放在外部查询中:

      select ...
      from (
         select ...
         from ...
         where ...
         group by ...
         having ...
      ) x
      where ...
      

      【讨论】:

        【解决方案5】:

        在同一范围内,答案是否定的。如果允许子查询,那么您可以完全避免使用HAVING

        我认为HAVING 是不合时宜的。 Hugh Darwen 将HAVING 称为“结构化查询的愚蠢”:

        在旧 SQL 中,WHERE 子句不能 用于聚合结果,所以 他们必须发明HAVING(同 意思是WHERE):

        SELECT D#, AVG(Salary) AS Avg_Sal
          FROM Emp
         GROUP 
            BY D#
        HAVING AVG(Salary) > 999;
        

        但是如果我们有HAVING 在 1979 年可以这样写:

        SELECT * 
          FROM (
                SELECT D#, AVG(Sal) AS Avg_Sal
                  FROM Emp
                 GROUP 
                    BY D# 
               )
              AS dummy
        WHERE Avg_Sal > 999;
        

        我强烈怀疑 Darwen 的问题的答案是否定的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-07
          • 1970-01-01
          • 1970-01-01
          • 2019-11-08
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 2017-05-07
          相关资源
          最近更新 更多