Sql 有可能在HAVING子句之后有一个WHERE子句?

Sql 有可能在HAVING子句之后有一个WHERE子句?,sql,where,having,Sql,Where,Having,可以在HAVING子句之后使用WHERE子句吗 我首先想到的是子查询,但我不确定 如果答案是肯定的,你能举一些例子吗?HAVING子句就是groupby后面的WHERE子句。为什么不将WHERE条件放在HAVING子句中?从选择帮助 其中的处理顺序,分组方式, 并具有以下步骤 显示选定对象的处理顺序 带有WHERE子句、组的语句 根据条款和拥有条款: FROM子句返回一个首字母 结果集 WHERE子句不包括行not 满足其搜索条件 GROUPBY子句收集 将选定行分成一组,每组一行 GROUP

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

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


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

HAVING子句就是groupby后面的WHERE子句。为什么不将WHERE条件放在HAVING子句中?

从选择帮助

其中的处理顺序,分组方式, 并具有以下步骤 显示选定对象的处理顺序 带有WHERE子句、组的语句 根据条款和拥有条款:

FROM子句返回一个首字母 结果集

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

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

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

附加条款 排除不符合其搜索条件的行 条件


所以,不,你不能。

如果这是一个技巧性的问题,如果WHERE和have不在同一级别,就像你提到的,子查询是可能的

我想那样做会管用的

HAVING value=从中选择maxvalue foo其中crit=123

p、 s:你为什么问? 你有什么特别的问题吗


p、 s.s:好吧,傻我,我错过了面试*标签…

不,不是在同一个问题中

where子句位于having和group by之前。如果要在分组之前过滤掉记录,条件将出现在where子句中,如果要过滤掉分组记录,条件将出现在having子句中:

如果出于某种奇怪的原因,这两种方法都无法使用,则必须将查询设为子查询,以便将where子句放入外部查询:

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

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

我认为拥有是一个时代错误。Hugh Darwen提到结构化查询的愚蠢之处:

在旧SQL中,WHERE子句不能 用于聚合结果,因此 他们不得不发明用同样的方法来做 含义如下:

但是如果我们有 1979年,人们可以这样写:

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

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

这是一个技巧/面试问题,还是你有真正的问题要解决?是的。问题来自访谈。从概念上讲,HAVING子句是在GROUP BY operation之后应用的,而WHERE子句是在GROUP BY operation之前应用的,因此理论上可以通过WHERE子句中的“过滤”进行优化。在实践中,您将始终必须查看优化器如何处理它,例如检查执行计划。也可以考虑人类读者,他们通常期望看到“WHERE”在WHERE子句中谓语而不是连接子句,具有子句等。
SELECT D#, AVG(Salary) AS Avg_Sal
  FROM Emp
 GROUP 
    BY D#
HAVING AVG(Salary) > 999;
SELECT * 
  FROM (
        SELECT D#, AVG(Sal) AS Avg_Sal
          FROM Emp
         GROUP 
            BY D# 
       )
      AS dummy
WHERE Avg_Sal > 999;