51
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30

また

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
4

8 に答える 8

81

理論 (理論ではSQL Standardを意味します) では、WHERE は行を返す前に結果セットを制限し、HAVING はすべての行を取得した後に結果セットを制限します。したがって、WHERE の方が高速です。この点に関して、SQL 標準準拠の DBMS では、WHERE に条件を設定できない場合にのみ HAVING を使用してください (一部の RDBMS の計算列など)。

両方の実行計画を確認して自分で確認するだけで、これに勝るものはありません (データを使用した特定の環境での特定のクエリの測定)。

于 2008-11-30T08:42:19.407 に答える
11

エンジンにもよるかもしれません。たとえば、MySQL は HAVING をチェーンのほぼ最後に適用します。つまり、最適化の余地はほとんどありません。マニュアルから:

HAVING 句は、アイテムがクライアントに送信される直前のほぼ最後に適用され、最適化は行われません。(HAVINGの後にLIMITが適用されます。)

この動作はほとんどの SQL データベース エンジンで同じだと思いますが、保証はできません。

于 2008-11-30T08:46:42.330 に答える
7

2 つのクエリは同等であり、DBMS クエリ オプティマイザーはこれ認識し、同じクエリ プランを生成する必要があります。そうではないかもしれませんが、状況を認識するのは非常に簡単なので、最新のシステム (Sybase でさえ) で対処できると思います。

グループ関数に条件を適用するには、HAVING 句を使用する必要があります。そうしないと、WHERE 条件に移動できます。例えば。たとえば、クエリを COUNT(DZIALU) > 10 を持つグループに制限したい場合は、条件を HAVING に入れる必要があります。これは、個々の行ではなくグループに作用するためです。

于 2008-11-30T10:18:37.170 に答える
2

彼らが最適化すると言っても、実際には制御を取り、コンピュータに何をすべきかを指示しているわけではありません。私は、havingの使用がwhere句の代替ではないことに同意します。sum()のようなものが使用されたグループに適用されるという特別な使用法があり、結果セットを制限して、sum()自体が100を超えるグループのみを表示するようにします。グループで作業する、行で作業する場所。リンゴとオレンジです。ですから、実際には、2つの非常に異なる動物であるため、比較するべきではありません。

于 2013-01-03T19:43:18.813 に答える
2

WHERE 句の方が高速だと思いますが、まったく同じように最適化される可能性があります。

于 2008-11-30T08:42:03.930 に答える
0

SQL Server は両方の同じステートメントを同様の計画に解析するのに十分スマートであるため、両方のステートメントのパフォーマンスは同じになります。

したがって、クエリで WHERE を使用するか HAVING を使用するかは問題ではありません。

ただし、理想的には、WHERE 句を構文的に使用する必要があります。

于 2015-03-24T07:45:31.197 に答える