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)
这有效.为什么这样?
基本上是因为它们定义的目的不同.该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日