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


26

HAVINGSQLクエリで使用するにはGROUP BY、列名を集約する必要がありますか?

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

同時に共存する必要がありますか?

回答:


25

いや

Oracleの次のクエリが機能するという事実によって証明されるように、それらは共存する必要はありません。

select * from dual having 1 = 1;

同様に、PostgreSQLでは次のクエリが機能します。

select 1 having 1 = 1;

そうhaving しない 必要 group 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;

NB次のクエリフォームも機能します。

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;

using havingは、この最後のクエリの簡略版であることがわかります。


要約すると、フェーズのhaving適用さgroup byフェーズのwhere適用されます。group by


2
別の例:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
ypercubeᵀᴹ

1
はい。また、PostgreSQLでは、select 1 having count(*) = 1;まだ把握していない次の構成を許可しています。
コリン 'tハート14年

SQL Serverでも使用できSELECT 1 AS id, 'Colin' AS name;ますが、Oracleなどの特別なdualテーブルがあります。これらの構文のどちらもANSI / ISO SQL(これが必要FROM)とは思いません。
ypercubeᵀᴹ

不足しているという意味ではありませんfromが、どの列でこれが集計されているかについては何も示されていないのでcount(*)having句内への参照です。おそらく、select句のすべての列で集計されます。
コリン 'tハート14年

わかった はい、それがそれであることに同意します(あなたが意味するすべての行-空のテーブルのすべての行を集計する)。
ypercubeᵀᴹ


1

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


1

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

例えば

     select count(*)
     from dual
     having count(*) > 5;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.