質問

間違った方法でグーグルをしている必要があります。そうでないと、バカな瞬間があります。

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を評価します。

 select statement diagram

参照

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グループで*を選択します

こちらから。

  

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

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

プロジェクトに取り組んでいる間、これも私の質問でした。上記のように、 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」の主題は、は行ですが、「持つ」という件名はグループです。私は正しいですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top