如果我在select
子句中创建别名,则不能在where
子句中使用它,因为根据sql查询的执行顺序,where
在select
之前。
但是我可以在select
子句中创建一个别名,并在having
子句中使用它,尽管having
在select
之前。
为什么会这样呢?
前任:
select type, (case when number>25 then 1 else 0 end) inc
from animals
where inc='1';
这不会工作。但,
select type, (case when number>25 then 1 else 0 end) inc
from animals
having inc='1';
这行得通。为什么这样?
最佳答案
基本上是因为它们是出于不同目的而定义的。 WHERE
子句用于记录过滤,而HAVING
子句用于通过聚合函数(GROUP BY
)进行过滤。
在第二个查询中,正在使用隐式GROUP BY
过滤,因此,例如,如果将另一列添加到SELECT
子句中,则结果将不同。
基于Martin Smith的更正,编辑
创建HAVING
是为了允许对GROUP BY
产生的行进行过滤。如果未指定GROUP BY
,则将整个结果视为一个组。
或者
编辑2
现在关于ALIAS:
有关搜索条件中列引用的WHERE子句的规范说:
请参阅:7.6 <where clause>
,语法规则1。
有关搜索条件中列引用的HAVING子句的规范说:
请参阅:7.8 <having clause>
,语法规则1。
并将分组列定义为:
因此,总而言之,WHERE
必须引用表的一列,而HAVING
子句必须引用该行组的一个分组列。
(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992
关于sql - 别名在何处与具有之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12093405/