2010-11-27 8 views

答えて

3

HAVING要約行で動作 - GROUP BYが適用される前WHEREテーブル全体で動作しています。 (GROUP BYを脇に置くことはできません。GROUP BYを省略しても、舞台裏で起こっている暗黙的な動作は変更されません)。は、GROUP BYと一緒に使用するために予約されている節です。

このことから、WHEREはインデックスを使用できますが、HAVINGはそうではないことに注意することも重要です。 (グループ化されていない結果セットは非常に簡単ですが、理論的にはHAVINGのインデックスを使用できますが、実際にこのようにクエリオプティマイザが実装されたことはありません)。

+0

しかし、私がリンクしている答えはGROUP BYをまったく含んでいません... – ripper234

+2

@ ripper234:そのクエリとGROUP BYクエリのクエリアナライザを見ると、 (実際の式の値をロードする場合を除く) - HAVING句を適用するために、結果セット内のすべての要素に対してGROUP BY - O(n)反復の "ペナルティ"を支払っています。 –

+1

@ ripper234:group byを必要としないのは、GROUP BY演算子に対するMySQLの拡張であり、集約されていない列のサブセットでGROUP BYを使用するのと同じです。 http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –

2

MySQLはクエリをWHERE句まで評価し、HAVING句でフィルタリングします。だからHAVINGは列別名を認識できますが、WHEREは列エイリアスを認識できません。

GROUP BY句を省略すると、結果をグループ化しないようにクエリに指示するだけです。

+1

それは意味の違いではありません少なくとも、私はこの意味を理解していません)。それは実装の詳細のように思えます。 – ripper234

1

非常に広く言えば、WHEREはクエリに入るデータ(DBテーブル)をフィルタリングし、HAVINGはクエリの出力をフィルタリングします。

WHERE句の文は、テーブル(およびその他の外部データソース)のみを参照できますが、HAVING句の文はクエリによって生成されたデータのみを参照できます。

関連する問題