280

HAVINGWHEREはどう違いSQL SELECTますか?

編集:リンクに重要な情報が含まれているため、スティーブンの回答を正しいものとしてマークしました:

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

私が見た状況はWHEREそうではなくGROUP BY、私の混乱が始まった場所です. もちろん、これを知るまで、質問で指定することはできません。

4

18 に答える 18

397

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つ以上の住所と各都市の住所の数を含むマサチューセッツ州の都市の表を提供します。

于 2008-11-13T16:53:37.983 に答える
100

HAVING は、SELECT ステートメントで使用されるグループまたは集計関数の検索条件を指定します。

ソース

于 2008-11-13T16:48:26.233 に答える
28

私にとっての一番の違いはHAVING、SQL言語から削除された場合、以前と同じように人生は多かれ少なかれ続くでしょう。確かに、少数派のクエリは、派生テーブルやCTEなどを使用して書き直す必要がありますが、結果として理解と保守が容易になることは間違いありません。おそらく、ベンダーのオプティマイザーコードは、これを説明するために書き直す必要があります。これも、業界内での改善の機会です。

WHEREここで、言語から削除することを少し考えてみてください。今回は、存在するクエリの大部分を、明白な代替構造なしで書き直す必要があります。コーダーは、前の句をシミュレートする句を使用して、 (たとえばDUALOracleで)正確に1つの行を含むことがわかっているテーブルへの内部結合などのクリエイティブを取得する必要があります。そのような構造は考案されるでしょう。言語に何かが欠けていることは明らかであり、結果として状況はさらに悪化するでしょう。ONWHERE

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。それ以外の場合、結果は空のセットになります。

于 2011-11-28T10:15:32.270 に答える
22

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

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

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

select ステートメントの図

参考文献

于 2012-08-29T00:57:57.793 に答える
22

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;
于 2008-11-13T16:47:53.253 に答える
12

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

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
于 2008-11-13T16:47:06.703 に答える
8

WHEREは、SQLによって返されるセットの制限として適用されます。SQLの組み込みのセット操作とインデックスを使用するため、結果セットをフィルタリングするための最速の方法です。可能な限り常にWHEREを使用してください。

一部の集約フィルターにはHAVINGが必要です。これは、SQLが結果を取得、アセンブル、およびソートした後にクエリをフィルタリングします。したがって、WHEREよりもはるかに低速であり、それを必要とする状況を除いて回避する必要があります。

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

于 2008-11-13T16:53:49.903 に答える
7

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  
于 2016-03-17T12:49:58.230 に答える
4

b/wWHEREHAVING句の違い:

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

なぜHAVING条項が必要なのですか?

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

于 2016-12-31T05:17:17.117 に答える
2

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

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

于 2016-12-31T05:06:37.540 に答える
1

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

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

于 2008-11-13T16:56:27.463 に答える
1

問題が発生し、との別の違いを見つけましWHEREHAVING。インデックス付きの列では同じようには機能しません。

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

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

于 2011-03-09T16:50:57.423 に答える
1

が使用されていない場合GROUP BYWHEREandHAVING句は本質的に等価です。

ただし、GROUP BYを使用する場合:

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

リソースはこちらから

于 2016-10-02T20:09:56.680 に答える
0

WHERE句はベーステーブルの値を比較するために使用されますが、HAVING句はクエリの結果セット内の集計関数の結果をフィルタリングするために使用できます。ここをクリックしてください

于 2013-01-29T10:33:42.847 に答える
0

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

ここで、userids と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

于 2012-06-06T10:26:58.647 に答える
0

ここから。

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

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

于 2008-11-13T16:50:14.763 に答える
-1

集計関数の結果に基づいてクエリを制約するために HAVING を使用します。EG select * in blahblahblah group by SOMETHING with count(SOMETHING)>0

于 2008-11-13T16:49:08.743 に答える