HAVING
SQLクエリで使用するにはGROUP BY
、列名を集約する必要がありますか?
SQLクエリHAVING
なしで使用できる特殊なケースはありGROUP BY
ますか?
同時に共存する必要がありますか?
HAVING
SQLクエリで使用するにはGROUP BY
、列名を集約する必要がありますか?
SQLクエリHAVING
なしで使用できる特殊なケースはありGROUP BY
ますか?
同時に共存する必要がありますか?
回答:
いや
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;
あなたは交換する必要があるwhere
とhaving
次のように、この場合には:
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
select 1 having count(*) = 1;
まだ把握していない次の構成を許可しています。
SELECT 1 AS id, 'Colin' AS name;
ますが、Oracleなどの特別なdual
テーブルがあります。これらの構文のどちらもANSI / ISO SQL(これが必要FROM
)とは思いません。
from
が、どの列でこれが集計されているかについては何も示されていないのでcount(*)
、having
句内への参照です。おそらく、select
句のすべての列で集計されます。
グループをフィルタリングするために使用されます。
where句は、行のフィルタリングに使用されます。
having
れる印加凝集段階後ように使用することができるフィルタ群。
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);