SQLクエリでHAVING
を使用するには、列名を集計するGROUP BY
が必要ですか?
SQLクエリでGROUP BY
なしでHAVING
を使用できる特別なケースはありますか?
それらは同時に共存する必要がありますか?
番号。
次のOracleのクエリが機能するという事実からわかるように、これらは共存する必要はありません。
select * from dual having 1 = 1;
同様に、PostgreSQLでは次のクエリが機能します。
select 1 having 1 = 1;
したがって、having
しないrequiregroup by
。
持つことは適用後集計フェーズであり、集計結果をフィルタリングする場合に使用する必要があります。したがって、その逆は当てはまらず、以下は機能しません。
select a, count(*) as c
from mytable
group by a
where c > 1;
この場合、次のようにwhere
をhaving
に置き換える必要があります。
select a, count(*) as c
from mytable
group by a
having c > 1;
注意:次のクエリフォームも機能します。
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
having
の使用は、この最後のクエリの簡略版であることがわかります。
要約すると、having
はgroup by
フェーズの後に適用されます後where
が適用されますbeforegroup by
フェーズ。
を持つことは、グループをフィルタリングするために使用されます。
where句は行のフィルタリングに使用されます。
GROUP BY句がない場合、クエリはリレーション全体を1つのグループと見なします。
例えば.
select count(*)
from dual
having count(*) > 5;
HAVINGはグループをフィルタリングしています。 GROUP BYの原因がない場合、すべての行に1つのグループが表示されます。したがって、HAVINGの述部がtrueと評価された場合、1行が取得され、それ以外の場合は行が取得されません。