わかりました、意味について少しずつ学んでいますHAVING
。
さて、私の質問は、これら 2 つのクエリに異なるパフォーマンス特性があるかどうかです。
持たずに
SELECT x + y AS z, t.* FROM t
WHERE
x = 1 and
x+y = 2
持つと
SELECT x + y AS z, t.* FROM t
WHERE
x = 1
HAVING
z = 2
はい、違うはずです-(1)より速いと予想されます。
Haveは、最初にメインクエリが実行され、次に、Havingフィルタが適用されることを保証します。したがって、基本的に、(クエリからHavingを差し引いた)によって返されるデータセットに対して機能します。
最初のクエリは、それらのレコードをまったく選択しないため、望ましいはずです。
HAVING は、GROUP BY を含むか、集計関数の結果を含む単一の行を返すクエリに使用されます。たとえばSELECT SUM(scores) FROM t HAVING SUM(scores) > 100
、1 行を返すか、まったく行を返さないかのいずれかです。
2 番目のクエリは、SQL 標準では無効と見なされ、一部のデータベース システムでは受け入れられません。