2012-08-23 121 views
6

如果我在select子句中創建了別名,那麼我不能在where子句中使用它,因爲根據sql查詢的執行順序whereselect之前。與別名之間的區別

但我可以創建select子句中的別名,雖然havingselect使用它之前在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'; 

This works。爲什麼這樣?

+6

這是標準的MySQL擴展。例如,你不能在SQL Server的'having'中引用列別名。 –

回答

5

基本上,因爲他們在哪裏定義爲不同的目的。 WHERE子句用於記錄過濾,HAVING子句設計用於使用集合函數GROUP BY)進行過濾。 在您的第二個查詢中,正在使用隱含的GROUP BY篩選,因此,例如,如果向SELECT子句添加另一列,則最終會得到不同的結果。

EDIT由馬丁·史密斯

HAVING基於校正是創建允許產生的GROUP BY的行的過濾。當沒有指定GROUP BY時,整個結果被視爲一個組。

如果既未<where clause>也不是<group by clause>被指定,然後 設T是前述<from clause>

...的組是 整個表的結果如果沒有指定<group by clause>

EDIT 2 現在關於別名:

有關將在搜索條件的列的引用在WHERE子句中的規範是:

直接包含在<search condition>每個<column reference>應 明確引用T的列或者是外部參考。

參考:7.6 <where clause>,句法規則1。

用於與在搜索條件中的列的引用HAVING子句規範這樣說:

直接包含在<search condition>每個<column reference>應明確地引用Ť 的分組列或者可以是外參考。

參見:7.8 <having clause>,語法規則1.

而一個分組列被定義爲:

<group by clause>引用的列是一個分組列。

所以在最後的WHERE必須引用表中的一列和HAVING子句必須引用組行的一個分組列。

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

+0

但是,在'select'執行之前,'has'是否會提取別名? – pooja

+0

任何引用「在標準SQL中不能使用沒有GROUP BY的HAVING子句」? –

+0

沒有引用,但衆所周知,HAVING是爲過濾由GROUP BY子句產生的行而創建的。 http://en.wikipedia.org/wiki/SQL – davidmontoyago

相關問題