6

If I create an alias in the select clause then I cannot use it in the where clause because according to the order of execution of sql queries where comes before select.

But I can create an alias in the select clause and use it in a having clause though having comes before select.

Why is it so?

Ex:

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

this wont work. But,

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

This works. Why so?

4

1 に答える 1

5

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

マーティン・スミスによる修正に基づく編集

HAVINGの結果の行をフィルタリングできるように作成されましたGROUP BY。noGROUP BYを指定すると、結果全体がグループと見なされます。

a も a も指定されていない場合、<where clause>T<group by clause>は前の結果とします。<from clause>

また

<group by clause>... noが指定されている場合、グループはテーブル全体です

EDIT 2 エイリアスについて:

検索条件の列参照に関する WHERE 句の仕様には、次のように書かれています。

<column reference>に直接含まれるそれぞれは、<search condition>明確に Tの列を参照するか、外部参照でなければなりません。

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

検索条件の列参照に関する HAVING 句の仕様には、次のように書かれています。

<column reference>に直接含まれる それぞれは、Tのグループ化列<search condition>を明確に参照するか、外部参照になります。

参照: 7.8 <having clause>、構文規則 1。

グループ化列は次のように定義されます。

で参照されている<group by clause>列は、グループ化列です。

したがって、結論として、WHEREはテーブルの列を参照するHAVING必要があり、句は行のグループのグループ化列を参照する必要があります。

(第 2 非公式レビュー ドラフト) ISO/IEC 9075:1992、データベース言語 SQL - 1992 年 7 月 30 日

于 2012-08-23T14:15:13.457 に答える