web-dev-qa-db-ja.com

HAVINGとWHEREの違いは何ですか?

私は間違った方法でグーグルしている必要がありますまたは私は時間内に愚かな瞬間を過ごしています。

SQL SELECTステートメントにおけるHAVINGWHEREの違いは何ですか?

編集:リンク上の重要な情報が含まれていたので、Stevenの回答を正しい回答としてマークしました。

GROUP BYが使用されていない場合、HAVINGWHERE句のように動作します。

私がWHEREを見た状況はGROUP BYを持たず、私の混乱が始まったところです。もちろん、これがわかるまでは、質問に指定することはできません。

非常に啓発的なすべての答えに感謝します。

250
ColinYounger

HAVINGは、SELECT文で使用するグループまたは集約関数の検索条件を指定します。

出典

88
Steven

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の都市のテーブルを提供します。

338
wcm

私にとって最大の違いは、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を含む単一行になります。それ以外の場合、結果は空のセットになります。

26
onedaywhen

両者の違いは、GROUP BY句との関係にあります。

  • GROUP BYの前にくる場所SQLはレコードをグループ化する前にWHERE句を評価します。

  • HAVINGはGROUP BYの後に来ます。 SQLはレコードをグループ化した後にHAVINGを評価します。

select statement diagram

参考文献

21
Paul Sweatte

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;
21
Kaiser Advisor

HAVINGは、GROUP BYなどの集合体を使用している場合に使用されます。

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
12
Galwegian

SQLによって返されるセットに対する制限としてWHEREが適用されます。これはSQLの組込みセット操作とインデックスを使用するため、結果セットをフィルタ処理する最も速い方法です。できるだけWHEREを使用してください。

HAVINGはいくつかの集約フィルタに必要です。 sqlが結果を取得、アセンブル、ソートした後にクエリをフィルタリングします。したがって、それはWHEREよりはるかに遅く、それを必要とする状況を除いて避けるべきです。

SQL Serverでは、WHEREの方がはるかに高速な場合でも、HAVINGの使用をやめることができます。しないでください。

8
davidcl

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  

違いはWHEREHAVING句の違いです。

WHERE句とHAVING句の主な違いは、WHEREは行操作に使用され、HAVINGは列操作に使用されることです。

なぜHAVING句が必要なのですか?

ご存じのとおり、集約関数は列に対してのみ実行できるため、WHERE句では集約関数を使用できません。したがって、HAVING句で集計関数を使用します。

4
M Asad Ali

GROUP BYを使用しない場合、WHERE句とHAVING句は本質的に同等です。

ただし、GROUP BYが使用されている場合:

  • WHERE句は、結果からレコードをフィルタリングするために使用されます。グループ化が行われる前に、フィルタリングが行われます。
  • HAVING句は、グループから値をフィルタリングするために(つまり、グループへの集計が実行された後に条件をチェックするために)使用されます。

からのリソースはこちら

3
bebosh

問題があり、WHEREHAVINGの間に別の違いがあることを知りました。インデックス付きカラムでは同じようには機能しません。

WHERE my_indexed_row = 123は行を表示し、他のインデックス付き行に対して自動的に "ORDER ASC"を実行します。

HAVING my_indexed_row = 123は最も古い "挿入された"行から最新のものまで、順序なしですべてを表示します。

2
Simmoniz

集約クエリでは、(集約関数が使用される任意のクエリ)集約された中間結果セットが生成される前に、where句の述語が評価されます。

Having句の述語は、生成された後に集計結果セットに適用されます。そのため、集計値の述語条件をWhere句ではなくHave句に配置する必要があります。また、Where句ではなくSelect句で定義されているエイリアスを使用できます。

1
Charles Bretana

WHERE句は基本テーブルの値を比較するために使用されますが、HAVING句はクエリの結果セット内の集約関数の結果をフィルタ処理するために使用されます。クリック ここ

1
Muhammad Ali

その考え方の1つは、having句がwhere句に対する追加のフィルタであるということです。

WHERE句を使用して、結果からレコードをフィルタリングします。フィルタはグループ化が行われる前に行われます。 HAVING句は、グループから値をフィルタするために使用されます。

1
Ved Prakash

"where"の件名が行であるのに対して、 "having"の件名がグループであるということだけであるかもしれません。私は正しいですか?

0
Viky Leaf

プロジェクトに取り組んでいる間、これも私の質問でした。上記のように、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)を持つuseridsと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

0
Nayan

集約関数の結果に基づいてクエリを制約するためにHAVINGを使用します。例えば。 blahblahblahグループで*(SOMETHING)> 0のSOMETHINGを選択

0
JasonTrue

から ここ

標準SQLでは、HAVINGはGROUP BY句の列または集計関数で使用される列のみを参照する必要があります。

データベース行に適用されるWHERE句とは対照的に

0
Harry Lime