HAVING
とWHERE
はどう違いSQL SELECT
ますか?
編集:リンクに重要な情報が含まれているため、スティーブンの回答を正しいものとしてマークしました:
GROUP BY
が使用されていない場合は、句HAVING
のように動作しますWHERE
私が見た状況はWHERE
そうではなくGROUP BY
、私の混乱が始まった場所です. もちろん、これを知るまで、質問で指定することはできません。
HAVING
とWHERE
はどう違いSQL SELECT
ますか?
編集:リンクに重要な情報が含まれているため、スティーブンの回答を正しいものとしてマークしました:
GROUP BY
が使用されていない場合は、句HAVING
のように動作しますWHERE
私が見た状況はWHERE
そうではなくGROUP BY
、私の混乱が始まった場所です. もちろん、これを知るまで、質問で指定することはできません。
HAVING:集計が行われた後に条件をチェックするために使用されます。WHERE:集計が行われる前
に
条件をチェックするために使用されます。
このコード:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
MAのすべての都市と各都市の住所の数の表を提供します。
このコード:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5
5つ以上の住所と各都市の住所の数を含むマサチューセッツ州の都市の表を提供します。
HAVING は、SELECT ステートメントで使用されるグループまたは集計関数の検索条件を指定します。
私にとっての一番の違いはHAVING
、SQL言語から削除された場合、以前と同じように人生は多かれ少なかれ続くでしょう。確かに、少数派のクエリは、派生テーブルやCTEなどを使用して書き直す必要がありますが、結果として理解と保守が容易になることは間違いありません。おそらく、ベンダーのオプティマイザーコードは、これを説明するために書き直す必要があります。これも、業界内での改善の機会です。
WHERE
ここで、言語から削除することを少し考えてみてください。今回は、存在するクエリの大部分を、明白な代替構造なしで書き直す必要があります。コーダーは、前の句をシミュレートする句を使用して、 (たとえばDUAL
Oracleで)正確に1つの行を含むことがわかっているテーブルへの内部結合などのクリエイティブを取得する必要があります。そのような構造は考案されるでしょう。言語に何かが欠けていることは明らかであり、結果として状況はさらに悪化するでしょう。ON
WHERE
TL; DRHAVING
明日は負ける可能性があり、状況は悪化することはなく、おそらく良くなるでしょうが、同じことは言えませんWHERE
。
ここでの回答から、多くの人は、句が句HAVING
なしで使用される可能性があることに気付いていないようGROUP BY
です。この場合、HAVING
句はテーブル式全体に適用され、定数のみがSELECT
句に含まれている必要があります。通常、このHAVING
句には集計が含まれます。
これは思ったよりも便利です。たとえば、このクエリを検討して、name
列が次のすべての値に対して一意であるかどうかをテストしT
ます。
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
考えられる結果は2つだけです。HAVING
句がtrueの場合、結果は値を含む単一の行になります1
。それ以外の場合、結果は空のセットになります。
2 つの違いは、GROUP BY 句との関係にあります。
WHERE は GROUP BY の前に来ます。SQL は、レコードをグループ化する前に WHERE 句を評価します。
HAVING は GROUP BY の後に来ます。SQL は、レコードをグループ化した後に HAVING を評価します。
参考文献
WHERE キーワードは集計関数では使用できないため、SQL に HAVING 句が追加されました。
詳細については、このw3schools リンクを確認してください
構文:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
次のようなクエリ:
SELECT column_name, COUNT( column_name ) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
HAVING COUNT( column_name ) >= 3;
...派生テーブルを使用して (および を省略してHAVING
) 次のように書き換えることができます。
SELECT column_name, column_name_tally
FROM (
SELECT column_name, COUNT(column_name) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
) pointless_range_variable_required_here
WHERE column_name_tally >= 3;
HAVING
などの集計を使用している場合に使用されますGROUP BY
。
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
WHEREは、SQLによって返されるセットの制限として適用されます。SQLの組み込みのセット操作とインデックスを使用するため、結果セットをフィルタリングするための最速の方法です。可能な限り常にWHEREを使用してください。
一部の集約フィルターにはHAVINGが必要です。これは、SQLが結果を取得、アセンブル、およびソートした後にクエリをフィルタリングします。したがって、WHEREよりもはるかに低速であり、それを必要とする状況を除いて回避する必要があります。
SQL Serverを使用すると、WHEREの方がはるかに高速な場合でも、HAVINGの使用を回避できます。しないでください。
WHERE 句は集計関数では機能しません
意味: このおまけのように使用しないでください: テーブル名
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
HERE WHERE 句を使用する代わりに、HAVING.. を使用する必要があります。
GROUP BY 句を使用しないと、HAVING 句は WHERE 句として機能します
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
b/wWHERE
とHAVING
句の違い:
句の主な違いはWHERE
、行操作に使用され、列操作に使用されることです。HAVING
WHERE
HAVING
なぜHAVING
条項が必要なのですか?
ご存知のように、集計関数は列に対してのみ実行できるため、WHERE
句で集計関数を使用することはできません。したがって、HAVING
節で集計関数を使用します。
これを考える 1 つの方法は、having 句は where 句に対する追加のフィルターであるということです。
WHERE句を使用して、結果からレコードをフィルター処理します。フィルタは、グループ化が行われる前に発生します。HAVING句は、グループから値をフィルター処理するために使用されます
集計クエリでは、(集計関数が使用されるクエリ)where句の述語は、集計された中間結果セットが生成される前に評価されます。
Have句の述語は、生成された後に集計結果セットに適用されます。そのため、集計値の述語条件は、Where句ではなく、Having句に配置する必要があります。また、Where句ではなく、Having句のSelect句で定義されたエイリアスを使用できるのはそのためです。
問題が発生し、との別の違いを見つけましWHERE
たHAVING
。インデックス付きの列では同じようには機能しません。
WHERE my_indexed_row = 123
行を表示し、他のインデックス付き行に対して自動的に「ORDERASC」を実行します。
HAVING my_indexed_row = 123
最も古い「挿入された」行から最新の行まで、順序なしですべてが表示されます。
が使用されていない場合GROUP BY
、WHERE
andHAVING
句は本質的に等価です。
ただし、GROUP BY
を使用する場合:
WHERE
句は、結果からレコードをフィルタリングするために使用されます。フィルタリングは、グループ化が行われる前に行われます。HAVING
句は、グループから値をフィルタリングするために使用されます (つまり、グループへの集約が実行された後の条件をチェックするため)。リソースはこちらから
WHERE句はベーステーブルの値を比較するために使用されますが、HAVING句はクエリの結果セット内の集計関数の結果をフィルタリングするために使用できます。ここをクリックしてください。
プロジェクトに取り組んでいる間、これは私の質問でもありました。上記のように、HAVINGは既に見つかったクエリ結果の条件をチェックします。ただし、WHEREは、クエリの実行中に条件を確認するためのものです。
これを説明するために例を挙げましょう。このようなデータベース テーブルがあるとします。
usertable{ int userid, date datefield, int dailyincome }
次の行がテーブルにあるとします。
1, 2011-05-20, 100
1, 2011-05-21, 50
1, 2011-05-30, 10
2, 2011-05-30, 10
2, 2011-05-20, 20
ここで、userid
s とsum(dailyincome)
そのsum(dailyincome)>100
書くと:
SELECT userid, sum(dailyincome) FROM usertable WHERE sum(dailyincome)>100 GROUP BY userid
これはエラーになります。正しいクエリは次のようになります。
SELECT userid, sum(dailyincome) FROM usertable GROUP BY userid HAVING sum(dailyincome)>100
集計関数の結果に基づいてクエリを制約するために HAVING を使用します。EG select * in blahblahblah group by SOMETHING with count(SOMETHING)>0