私は間違った方法でグーグルしている必要がありますまたは私は時間内に愚かな瞬間を過ごしています。
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
マサチューセッツ州のすべての都市と各都市の住所の数の表を提供します。
このコード:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5
5つ以上の住所と各都市の住所の数を含む、MAの都市のテーブルを提供します。
私にとって最大の違いは、HAVING
がSQL言語から削除された場合、以前と同様に多少なりとも寿命が延びることです。確かに、少数派のクエリは派生テーブル、CTEなどを使用して書き直す必要がありますが、その結果、間違いなく理解しやすく維持しやすいでしょう。たぶんベンダーのオプティマイザコードはこれを説明するために書き直される必要があるでしょう、そしてここでも業界内の改善のための機会。
それではしばらくの間、言語からWHERE
を削除することを検討してください。今回は多数存在するクエリを、明白な代替構文なしで書き直す必要があるでしょう。コーダーは創造的にならなければならないでしょう。前のDUAL
句をシミュレートするためにON
句を使用して、正確に1行を含むことがわかっているテーブルへの内部結合(Oracleの場合はWHERE
)。そのような構造は考案されるでしょう。それは言語から何かが欠けていたことが明らかであり、状況は結果として悪化するでしょう。
TL; DR明日はHAVING
を失う可能性があり、事態はもっと悪くない、おそらくそれ以上になることはありませんが、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
を含む単一行になります。それ以外の場合、結果は空のセットになります。
両者の違いは、GROUP BY句との関係にあります。
GROUP BYの前にくる場所SQLはレコードをグループ化する前にWHERE句を評価します。
HAVINGはGROUP BYの後に来ます。 SQLはレコードをグループ化した後にHAVINGを評価します。
参考文献
WHEREキーワードは集約関数では使用できないため、HAVING句がSQLに追加されました。
これをチェックしてください w3schools link 詳細については==
構文:
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;
SQLによって返されるセットに対する制限としてWHEREが適用されます。これはSQLの組込みセット操作とインデックスを使用するため、結果セットをフィルタ処理する最も速い方法です。できるだけWHEREを使用してください。
HAVINGはいくつかの集約フィルタに必要です。 sqlが結果を取得、アセンブル、ソートした後にクエリをフィルタリングします。したがって、それはWHEREよりはるかに遅く、それを必要とする状況を除いて避けるべきです。
SQL Serverでは、WHEREの方がはるかに高速な場合でも、HAVINGの使用をやめることができます。しないでください。
WHERE句は集約関数には機能しません
は意味:あなたはこのボーナスのように使うべきではありません:テーブル名
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
WHERE句を使用する代わりに、HAVINGを使用する必要があります。
gROUP BY句を使用しなくても、HAVING句はWHERE句として機能します。
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
違いはWHERE
とHAVING
句の違いです。
WHERE
句とHAVING
句の主な違いは、WHERE
は行操作に使用され、HAVING
は列操作に使用されることです。
なぜHAVING
句が必要なのですか?
ご存じのとおり、集約関数は列に対してのみ実行できるため、WHERE
句では集約関数を使用できません。したがって、HAVING
句で集計関数を使用します。
GROUP BY
を使用しない場合、WHERE
句とHAVING
句は本質的に同等です。
ただし、GROUP BY
が使用されている場合:
WHERE
句は、結果からレコードをフィルタリングするために使用されます。グループ化が行われる前に、フィルタリングが行われます。HAVING
句は、グループから値をフィルタリングするために(つまり、グループへの集計が実行された後に条件をチェックするために)使用されます。問題があり、WHERE
とHAVING
の間に別の違いがあることを知りました。インデックス付きカラムでは同じようには機能しません。
WHERE my_indexed_row = 123
は行を表示し、他のインデックス付き行に対して自動的に "ORDER ASC"を実行します。
HAVING my_indexed_row = 123
は最も古い "挿入された"行から最新のものまで、順序なしですべてを表示します。
集約クエリでは、(集約関数が使用される任意のクエリ)集約された中間結果セットが生成される前に、where句の述語が評価されます。
Having句の述語は、生成された後に集計結果セットに適用されます。そのため、集計値の述語条件をWhere句ではなくHave句に配置する必要があります。また、Where句ではなくSelect句で定義されているエイリアスを使用できます。
WHERE句は基本テーブルの値を比較するために使用されますが、HAVING句はクエリの結果セット内の集約関数の結果をフィルタ処理するために使用されます。クリック ここ !
その考え方の1つは、having句がwhere句に対する追加のフィルタであるということです。
WHERE句を使用して、結果からレコードをフィルタリングします。フィルタはグループ化が行われる前に行われます。 HAVING句は、グループから値をフィルタするために使用されます。
"where"の件名が行であるのに対して、 "having"の件名がグループであるということだけであるかもしれません。私は正しいですか?
プロジェクトに取り組んでいる間、これも私の質問でした。上記のように、HAVINGはすでに見つかったクエリ結果の条件をチェックします。しかしWHEREはクエリ実行中に条件をチェックするためのものです。
例を挙げて説明しましょう。このようなデータベーステーブルがあるとします。
usertable {intユーザーID、日付日付フィールド、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)
を持つuserid
sとsum(dailyincome)>100
を取得します。
もし書いたら
SELECT userid、sum(dailyincome)から使用可能なWHERE sum(dailyincome)> 100 GROUP BY userid
これはエラーになります。正しいクエリは次のようになります。
SELECT userid、sum(dailyincome)から使用可能なGROUP BY useridまでHAVING sum(dailyincome)> 100
集約関数の結果に基づいてクエリを制約するためにHAVINGを使用します。例えば。 blahblahblahグループで*(SOMETHING)> 0のSOMETHINGを選択