GROUP BY
ちょっと脇に置いておきましょう。通常のクエリ(なしGROUP BY
)では、セマンティックの違いは何ですか?なぜこの答えが機能するのですか?HAVING
(代わりに句にエイリアスを入れてくださいWHERE
)
3 に答える
HAVING
要約された行で動作します-が適用されるWHERE
前にテーブル全体で動作します。(脇にGROUP BY
置くことはできません。これは、で使用するために予約されている句です。を省略しても、舞台裏で発生している暗黙のアクションは変更されません)。GROUP BY
HAVING
GROUP BY
GROUP BY
WHERE
このため、インデックスを使用できるのに使用できないことに注意することも重要HAVING
です。(非常に些細なグループ化されていない結果セットでは、理論的にはのインデックスを使用できますがHAVING
、クエリオプティマイザーが実際にこのように実装されているのを見たことがありません)。
MySQLは、句までのクエリを評価し、WHERE
句でフィルタリングしHAVING
ます。そのためHAVING
、列のエイリアスを認識できますが、認識WHERE
できません。
句を省略するGROUP BY
ことで、結果をグループ化しないようにクエリに指示するだけだと思います。
非常に大まかに言えば、WHERE
クエリ (DB テーブル) に入るデータをフィルター処理し、クエリHAVING
の出力をフィルター処理します。
句内のステートメントWHERE
はテーブル (およびその他の外部データ ソース)HAVING
のみを参照できますが、句内のステートメントはクエリによって生成されたデータのみを参照できます。