WHERE句とHAVING句の違い
SQLでのWHERE句とHAVING句は、どちらも、入力行を絞ります。では、違いは何でしょうか……。
WHERE句は、グループ化や集約を演算する前に入力行を絞ります。
一方、HAVING句 は、グループと集約を演算した後に、グループ化された行を絞ります。
従って、WHERE句は集約前に評価されるので集約関数を持つことはできません。一方、HAVING 句は、集約後に評価されるので集約関数を持つことができます。
つまり、はじめにWHERE句で行を絞り、それをGROUP BY句でグループ化し、それを(グループ内を)HAVING句でまた絞る・・・てな感じです。
ちなみに、GROUP BY句とHAVING句はペアで使うものと思っている人がいるかもしれませんが(実は自分)……。実は、テーブル全体を一つの集合として、GROUP BY句なしで、HAVING句を問題なく使用することができます。