是否可以在 HAVING 子句之后使用 WHERE 子句?
我首先想到的是子查询,但我不确定。
PS如果答案是肯定的,你能举一些例子吗?
不,不在同一个查询中。
该where
子句位于having
和之前group by
。如果要在分组之前过滤掉记录,则条件进入where
子句,如果要过滤掉分组记录,则条件进入having
子句:
select ...
from ...
where ...
group by ...
having ...
如果由于某种奇怪的原因这些都不能使用,则必须使查询成为子查询,以便可以将where
子句放在外部查询中:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
HAVING 子句只是 GROUP BY 之后的 WHERE 子句。为什么不将 WHERE 条件放在 HAVING 子句中?
如果这是一个技巧问题,那么正如您提到的那样,如果 WHERE 和 HAVING 不在同一级别,则可能是子查询。
我想这样的事情会起作用
HAVING value=(SELECT max(value) FROM foo WHERE crit=123)
ps:你问什么?你有具体的问题吗?
pss:好吧傻我,我错过了“采访*”标签......
从 SELECT 帮助
WHERE、GROUP BY 和 HAVING 子句的处理顺序 以下步骤显示了带有 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序:
FROM 子句返回一个初始结果集。
WHERE 子句排除不满足其搜索条件的行。
GROUP BY 子句针对 GROUP BY 子句中的每个唯一值将选定行收集到一个组中。
选择列表中指定的聚合函数计算每个组的汇总值。
HAVING 子句还排除了不满足其搜索条件的行。
所以,不,你不能。
在同一范围内,答案是否定的。如果允许子查询,那么您可以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;
我强烈怀疑达尔文的问题的答案是否定的。