2012-08-23 4 views
6

に関して持っ間。違い私は<code>select</code>句でエイリアスを作成する場合は、SQLの実行順序に従って<code>where</code>を照会することは<code>select</code>前に来るので、私は<code>where</code>句で使用することはできませんどこで、別名

しかし、私は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'; 

これは機能します。なぜそうなのか?

+6

これは、標準のMySQL拡張です。たとえば、SQL Serverで 'having'のカラムエイリアスを参照することはできません。 –

答えて

5

基本的に異なる目的のために定義されているためです。 WHERE句はレコードフィルタリング用であり、HAVING句は集計関数GROUP BY)でフィルタリングするように設計されています。 2番目のクエリで暗黙のGROUP BYフィルタリングが使用されているため、たとえば、SELECT句に別の列を追加すると、結果は変わります。

HAVINGマーティン・スミス

による補正に基づく

EDITはGROUP BYの結果行のフィルタリングを可能にするために作成されました。 GROUP BYが指定されていない場合、結果全体がグループとみなされます。

<where clause><group by clause>も指定されていない場合、 次いでT先行<from clause>

又は

の結果であるものとする...グループは 全体表であります<group by clause>が指定されていない場合

今ALIASに関するEDIT 2

検索条件の列参照に関する句が、これは言うの仕様:

直接<search condition>に含まれる各<column reference>を参照して明確に ものTの列または外部参照である。

参照:7.6 <where clause>、構文規則1。

検索条件の列参照に関するHAVING句の仕様はこれは言う:

直接<search condition>に含まれる各<column reference>が明確T のグループ化カラムを参照または外側でなければなりません参照。

を参照してください。<group by clause>で参照列がグループ化カラムである

:7.8 <having clause>、文法規則1

そしてグループ化カラムは以下のように定義されます。

だから結論にWHEREは、テーブルの列を参照する必要があり、HAVING句は、行のグループのグループ化列を参照しなければなりません。

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

+0

しかし、「選択」が実行される前に、「持っている」ことがエイリアスをどのように拾うのでしょうか? – pooja

+0

"標準SQLではGROUP BYなしでHAVING句を使用できません"の引用はありますか? –

+0

引用はありませんが、HAVINGがGROUP BY句の結果の行をフィルタリングするために作成されたことはよく知られています。 http://en.wikipedia.org/wiki/SQL – davidmontoyago

関連する問題

 関連する問題