質問

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
役に立ちましたか?

解決

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

両方の実行計画を確認し、自分自身をチェックするだけで、それを打ち負かすものは何もありません(データを使用した特定の環境での特定のクエリの測定)。

他のヒント

このエンジンです。MySQL例えば、適用されるほとんど最後のチェーンの意味がほとんどありませんルームのための最適化。から マニュアル:

HAVING条項が適用のほぼ最後に、直前の項目をクライアントに送られ、最適化。(制限が適用後することのできる)

この挙動はほとんどのSQLデータベースエンジンだけを保証します。

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

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

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

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

両方のステートメントは、SQL Serverが両方の同じステートメントを類似のプランに解析するのに十分なほどスマートであるため、同じパフォーマンスを持ちます。

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

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

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