别名在哪里和有什么区别

poo*_*oja 6 sql group-by having having-clause

如果我中创建一个别名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';
Run Code Online (Sandbox Code Playgroud)

这不行.但,

select type, (case when number>25 then 1 else 0 end) inc 
from animals
having inc='1'; 
Run Code Online (Sandbox Code Playgroud)

这有效.为什么这样?

dav*_*ago 5

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

编辑基于Martin Smith的修正

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

如果既<where clause>没有<group by clause>指定a 也没有指定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日