【发布时间】:2010-12-12 22:04:05
【问题描述】:
可以在 HAVING 子句之后使用 WHERE 子句吗?
我首先想到的是子查询,但我不确定。
附:如果答案是肯定的,你能举一些例子吗?
【问题讨论】:
-
这是一个技巧/面试问题,还是你有真正的问题要解决?
-
是的。问题来自采访。
可以在 HAVING 子句之后使用 WHERE 子句吗?
我首先想到的是子查询,但我不确定。
附:如果答案是肯定的,你能举一些例子吗?
【问题讨论】:
HAVING 子句只是 GROUP BY 之后的 WHERE 子句。为什么不将 WHERE 条件放在 HAVING 子句中?
【讨论】:
来自 SELECT 帮助
WHERE、GROUP BY的处理顺序, 和 HAVING 子句的以下步骤 显示 SELECT 的处理顺序 带有 WHERE 子句、GROUP 的语句 BY 子句和 HAVING 子句:
FROM 子句返回一个初始值 结果集。
WHERE 子句不包括行 满足其搜索条件。
GROUP BY 子句收集 将选定的行分成一组,每个 GROUP BY 子句中的唯一值。
中指定的聚合函数 选择列表计算汇总值 每个组。
另外的 HAVING 子句 排除不符合其搜索的行 条件。
所以,不,你不能。
【讨论】:
如果这是一个技巧问题,则可能是 WHERE 和 HAVING 不在同一级别,正如您提到的,子查询。
我想这样的事情会起作用
HAVING value=(SELECT max(value) FROM foo WHERE crit=123)
ps:你为什么要问? 您有具体问题吗?
p.s.s:好吧,傻我,我错过了“interview*”标签...
【讨论】:
不,不在同一个查询中。
where 子句位于having 和group by 之前。如果你想在分组之前过滤掉记录,条件放在where子句中,如果你想过滤掉分组记录,条件放在having子句中:
select ...
from ...
where ...
group by ...
having ...
如果由于某种奇怪的原因这两个都不能使用,您必须使查询成为子查询,以便您可以将where 子句放在外部查询中:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
【讨论】:
在同一范围内,答案是否定的。如果允许子查询,那么您可以完全避免使用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 的问题的答案是否定的。
【讨论】: