在HAVING子句之后使用WHERE子句是否可行?
我首先想到的是子查询,但我不确定。
附言:如果答案是肯定的,能给出一些示例吗?
在HAVING子句之后使用WHERE子句是否可行?
我首先想到的是子查询,但我不确定。
附言:如果答案是肯定的,能给出一些示例吗?
不,不能在同一个查询中。
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子句中呢?
从SELECT帮助
WHERE、GROUP BY和HAVING子句的处理顺序以下步骤显示了带有WHERE子句、GROUP BY子句和HAVING子句的SELECT语句的处理顺序:
FROM子句返回初始结果集。
WHERE子句排除不符合其搜索条件的行。
GROUP BY子句将所选行收集到每个GROUP BY子句中唯一值的一个组中。
在选择列表中指定的聚合函数为每个组计算摘要值。
HAVING子句还将排除不符合其搜索条件的行。
因此,你不能。
在同一范围内,答案是否定的。如果允许使用子查询,则可以完全避免使用HAVING
。
我认为HAVING
是一个过时的东西。Hugh Darwen将HAVING
称为“结构化查询的愚蠢”:
我强烈怀疑对于达温的问题,答案是否定的。In old SQL, the
WHERE
clause could not be used on results of aggregation, so they had to inventHAVING
(with same meaning asWHERE
):
SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
But would we ever have had
HAVING
if in 1979 one could write:
SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;