如果我在select子句中创建别名,则不能在where子句中使用它,因为根据sql查询的执行顺序位于where前面select。
select
where
但是我可以在select子句中创建别名,并在子句中使用它,having尽管having它早于select。
having
为什么会这样呢?
前任:
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子句中,最终将得到不同的结果。
WHERE
HAVING
GROUP BY
SELECT
编辑 基于马丁·史密斯(Martin Smith)的更正
HAVING创建允许过滤产生的行GROUP BY。如果未GROUP BY指定no ,则将整个结果视为一个组。
如果既未指定a<where clause>也未<group by clause>指定a,则令T为前一个的结果<from clause>
<where clause>
<group by clause>
<from clause>
或者
…如果未<group by clause>指定,则该组为整个表格
编辑2 现在关于ALIAS:
有关搜索条件中列引用的WHERE子句的规范说:
<column reference>直接包含在中的每个<search condition>应明确引用T 列 或作为外部引用。
<column reference>
<search condition>
请参阅:7.6<where clause>,语法规则1。
有关搜索条件中列引用的HAVING子句的规范说:
<column reference>直接包含在中的 每个<search condition>应明确引用T 的分组列 或作为外部引用。
请参阅:7.8<having clause>,语法规则1。
<having clause>
和 分组列 被定义为:
在a中引用的列<group by clause>是分组列。
因此,总而言之,WHERE必须引用表的一列,而HAVING子句必须引用行组的分组列。
(第二次非正式审核草案)ISO / IEC 9075:1992,数据库语言SQL- 1992年7月30日