在HAVING子句之后可以有一个WHERE子句吗?

时间:2009-11-04 06:15:43

标签: sql where having

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

我想到的第一件事是子查询,但我不确定。

P.S。如果答案是肯定的,你能举一些例子吗?

5 个答案:

答案 0 :(得分:29)

不,不在同一个查询中。

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:5)

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

我猜这样的事情会起作用

  

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

p.s:你为什么问? 你有特定的问题吗?

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

答案 3 :(得分:2)

来自SELECT帮助

  

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

     

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

     

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

     

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

     

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

     

另外还有HAVING条款   排除不符合其搜索范围的行   条件。

所以,不,你不能。

答案 4 :(得分:1)

在同一范围内,答案是否定的。如果允许子查询,则可以避免完全使用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的问题的答案是否定的。