是否可以在HAVING子句后使用WHERE子句?
我想到的第一件事是子查询,但我不确定。
P.S。如果答案是肯定的,你能举一些例子吗?
答案 0 :(得分:29)
不,不在同一个查询中。
where
子句位于having
和group 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的问题的答案是否定的。