HAVINGSQLクエリで使用するにはGROUP BY、列名を集約する必要がありますか?
SQLクエリHAVINGなしで使用できる特殊なケースはありGROUP BYますか?
同時に共存する必要がありますか?
HAVINGSQLクエリで使用するには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);