如果我在select子句中创建别名,则不能在where子句中使用它,因为根据sql查询的执行顺序,whereselect之前。

但是我可以在select子句中创建一个别名,并在having子句中使用它,尽管havingselect之前。

为什么会这样呢?

前任:

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/

10-12 21:06