18

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

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

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

4

5 回答 5

31

不,不在同一个查询中。

where子句位于having和之前group by。如果要在分组之前过滤掉记录,则条件进入where子句,如果要过滤掉分组记录,则条件进入having子句:

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

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

select ...
from (
   select ...
   from ...
   where ...
   group by ...
   having ...
) x
where ...
于 2009-11-04T06:34:26.323 回答
5

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

于 2009-11-04T06:19:07.603 回答
5

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

我想这样的事情会起作用

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

ps:你问什么?你有具体的问题吗?

pss:好吧傻我,我错过了“采访*”标签......

于 2009-11-04T06:34:17.573 回答
3

从 SELECT 帮助

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

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

WHERE 子句排除不满足其搜索条件的行。

GROUP BY 子句针对 GROUP BY 子句中的每个唯一值将选定行收集到一个组中。

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

HAVING 子句还排除了不满足其搜索条件的行。

所以,不,你不能。

于 2009-11-04T06:23:52.540 回答
2

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

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

在旧的 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;

我强烈怀疑达尔文的问题的答案是否定的。

于 2009-11-04T09:10:20.817 回答