web-dev-qa-db-ja.com

SQLクエリでのGROUP BYなしのHAVINGの使用

SQLクエリでHAVINGを使用するには、列名を集計するGROUP BYが必要ですか?

SQLクエリでGROUP BYなしでHAVINGを使用できる特別なケースはありますか?

それらは同時に共存する必要がありますか?

28
Computernerd

番号。

次の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;

この場合、次のようにwherehavingに置き換える必要があります。

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の使用は、この最後のクエリの簡略版であることがわかります。


要約すると、havinggroup byフェーズの後に適用されますwhereが適用されますbeforegroup byフェーズ。

27
Colin 't Hart

を持つことは、グループをフィルタリングするために使用されます。

where句は行のフィルタリングに使用されます。

5
sqlengineer

GROUP BY句がない場合、クエリはリレーション全体を1つのグループと見なします。

例えば.

     select count(*)
     from dual
     having count(*) > 5;
2
Vikrant Singh

HAVINGはグループをフィルタリングしています。 GROUP BYの原因がない場合、すべての行に1つのグループが表示されます。したがって、HAVINGの述部がtrueと評価された場合、1行が取得され、それ以外の場合は行が取得されません。

2
msi77