基本的に異なる目的のために定義されているためです。 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
これは、標準のMySQL拡張です。たとえば、SQL Serverで 'having'のカラムエイリアスを参照することはできません。 –