别名在哪里和有什么区别

时间:2012-08-23 14:00:12

标签: 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';
这不会工作。但是,

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

这很有效。为什么这样?

1 个答案:

答案 0 :(得分:5)

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

编辑基于Martin Smith的修正

创建

HAVING以允许过滤由GROUP BY生成的行。如果未指定GROUP BY,则整个结果将被视为一个组。

  

如果既未指定<where clause>也未指定<group by clause>,   然后让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.

分组列定义为:

  

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

总之,WHERE必须引用表的一列,HAVING子句必须引用该行组的分组列。

(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992