小编典典

别名在何处与具有之间的区别

sql

如果我在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';

这行得通。为什么这样?


阅读 156

收藏
2021-04-22

共1个答案

小编典典

基本上是因为它们是出于不同目的而定义的。该WHERE子句用于记录过滤,该HAVING子句设计用于通过 聚合函数GROUP BY)进行过滤。在第二个查询中,GROUP BY正在使用隐式过滤,因此,例如,如果将另一列添加到SELECT子句中,最终将得到不同的结果。

编辑 基于马丁·史密斯(Martin Smith)的更正

HAVING创建允许过滤产生的行GROUP BY。如果未GROUP BY指定no ,则将整个结果视为一个组。

如果既未指定a<where clause>也未<group by clause>指定a,则令T为前一个的结果<from clause>

或者

…如果未<group by clause>指定,则该组为整个表格

编辑2 现在关于ALIAS:

有关搜索条件中列引用的WHERE子句的规范说:

<column reference>直接包含在中的每个<search condition>应明确引用T 或作为外部引用。

请参阅:7.6<where clause>,语法规则1。

有关搜索条件中列引用的HAVING子句的规范说:

<column reference>直接包含在中的 每个<search condition>应明确引用T 的分组列 或作为外部引用。

请参阅:7.8<having clause>,语法规则1。

分组列 被定义为:

在a中引用的列<group by clause>是分组列。

因此,总而言之,WHERE必须引用表的一列,而HAVING子句必须引用行组的分组列。

(第二次非正式审核草案)ISO / IEC 9075:1992,数据库语言SQL-
1992年7月30日

2021-04-22