質問
間違った方法でグーグルをしている必要があります。そうでないと、バカな瞬間があります。
SQL SELECT
ステートメントの HAVING
と WHERE
の違いは何ですか?
編集:Stevenの回答には、リンクに関する重要な情報が含まれていたため、正しい回答としてマークしました。
GROUP BY
が使用されていない場合、HAVING
はWHERE
句のように動作します
WHERE
を目にした状況には GROUP BY
がなく、混乱が始まりました。もちろん、これを知るまでは質問で指定することはできません。
非常に啓発的なすべての回答に感謝します。
解決
HAVINGは、検索条件を指定します SELECTステートメントで使用されるグループまたは集計関数。
他のヒント
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つ以上の住所と各都市の住所の数を含むMAの都市のテーブルを提供します。
最大の違いは、SQL言語から HAVING
を削除した場合、以前とほぼ同じように生活が続くことです。確かに、少数のクエリは派生テーブルやCTEなどを使用して書き換える必要がありますが、結果として間違いなく理解し、維持するのは間違いないでしょう。おそらくベンダーのオプティマイザーコードは、これを説明するために書き直す必要がありますが、これも業界内の改善の機会です。
言語から WHERE
を削除することをしばらく検討してください。今回は、存在するクエリの majority を、明白な代替構成なしで書き換える必要があります。コーダーは創造的である必要があります。 ON
句を使用して前の WHERE
句をシミュレートして、正確に1行(Oracleの DUAL
など)を含むことがわかっているテーブルへの内部結合。そのような構造は不自然です。言語から何かが欠落していることが明らかで、結果として状況は悪化します。
TL; DR明日は HAVING
を失う可能性があり、事態は悪化せず、恐らくは良くなるでしょうが、 WHERE
についても同じことが言えません。
ここでの回答から、多くの人々は、 GROUP BY
句なしで HAVING
句を使用できることに気付いていないようです。この場合、 HAVING
句はテーブル式全体に適用され、 SELECT
句には定数のみが必要です。通常、 HAVING
句には集約が含まれます。
これは見た目よりも便利です。たとえば、 T
:
name
列が一意であるかどうかをテストするには、次のクエリを検討してください。
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
可能な結果は2つのみです。 HAVING
句がtrueの場合、結果は値 1
を含む単一行になります。そうでない場合、結果は空になります設定します。
WHEREキーワードを集計関数で使用できなかったため、HAVING句がSQLに追加されました。
詳細については、 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;
この2つの違いは、GROUP BY句との関係にあります:
-
WHEREはGROUP BYの前にあります。 SQLは、レコードをグループ化する前にWHERE句を評価します。
-
HAVINGはGROUP BYの後にあります。 SQLは、レコードをグループ化した後にHAVINGを評価します。
参照
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 / w WHERE
および HAVING
句:
WHERE
と HAVING
句の主な違いは、 WHERE
が行操作に使用され、 HAVING
が列操作に使用されます。
HAVING
句が必要な理由
ご存じのとおり、集計関数は列でのみ実行できるため、 WHERE
句では集計関数を使用できません。したがって、 HAVING
句で集計関数を使用します。
GROUP BY
を使用しない場合、 WHERE
句と HAVING
句は本質的に同等です。
ただし、 GROUP BY
を使用する場合:
-
WHERE
句は、結果からレコードをフィルタリングするために使用されます。の グループ化が行われる前にフィルタリングが行われます。 -
HAVING
句は、グループから値をフィルタリングするために使用されます(つまり、 グループへの集約が実行された後に条件を確認してください。)
問題があり、 WHERE
と HAVING
の別の違いを見つけました。インデックス付きの列では同じようには機能しません。
WHERE my_indexed_row = 123
は行を表示し、&quot; ORDER ASC&quot;を自動的に実行します。他のインデックス付き行。
HAVING my_indexed_row = 123
は、最も古い「挿入」からすべてを表示します。順序なしで最新の行に移動します。
それを考える1つの方法は、having句がwhere句に対する追加のフィルターであることです。
WHERE 句を使用して、結果からレコードをフィルタリングします。フィルターは、グループ化が行われる前に発生します。 HAVING 句は、グループから値をフィルタリングするために使用されます
集計クエリでは、(集計関数が使用されるクエリ)集計された中間結果セットが生成される前にwhere句の述部が評価されます
Having句の述部は、生成された後に集計結果セットに適用されます。そのため、集計値の述語条件はWhere句ではなく、Having句に配置する必要があります。また、Where句ではなく、Having句のSelect句で定義されたエイリアスを使用できます。
WHERE句はベーステーブルの値の比較に使用されますが、HAVING句はクエリの結果セットの集計関数の結果のフィルタリングに使用できます こちらをクリックします!
集計関数の結果に基づいてクエリを制約するためにHAVINGを使用します。例えば。 count(SOMETHING)&gt; 0
を持つSOMETHINGによってblahblahblahグループで*を選択しますプロジェクトに取り組んでいる間、これも私の質問でした。上記のように、 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
今、 sum(dailyincome)&gt; 100
userid
sと sum(dailyincome)
を取得したい
書く場合:
SELECT userid、sum(dailyincome)FROM usertable WHERE sum(dailyincome)&gt; 100 GROUP BY userid
これはエラーになります。正しいクエリは次のとおりです。
userid、sum(dailyincome)FROM usertable GROUP BY userid HAVING sum(dailyincome)&gt; 100
「where」の主題は、は行ですが、「持つ」という件名はグループです。私は正しいですか?