如果我在中创建一个别名select
那么我不能在where
子句因为根据sql查询的执行顺序where
出现在之前select
.
但我可以在中创建一个别名select
子句并将其用于having
虽然条款having
出现在之前select
.
为什么会这样呢?
Ex:
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
条款你最终会得到不同的结果。
EDIT基于马丁·史密斯的修正
HAVING
创建是为了允许过滤由GROUP BY
。当没有GROUP BY
指定时,整个结果被视为一个组。
如果两者都不是<where clause>
nor a <group by clause>
被指定,
然后令 T 为前面的结果<from clause>
or
...该组是
如果没有则整个表<group by clause>
已指定
EDIT 2现在关于别名:
关于搜索条件中的列引用的 WHERE 子句规范如下:
Each <column reference>
直接包含在<search
condition>
将
明确引用a columnT 或为外部参考。
参考:7.6<where clause>
,语法规则 1。
有关搜索条件中列引用的 HAVING 子句的规范如下:
Each <column reference>
直接包含在<search
condition>
应明确提及分组列的 T
或作为外部参考。
参考:7.8<having clause>
,语法规则 1。
And a 分组栏定义为:
中引用的列<group by clause>
是一个分组列。
所以综上所述WHERE
必须引用表的列和HAVING
子句必须引用行组的分组列。
(第二次非正式审查草案)ISO/IEC 9075:1992,数据库
SQL 语言 - 1992 年 7 月 30 日 http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)