- ベストアンサー
SQL WHERE, HAVINGについて
- SQLのWHERE句とHAVING句について説明します。
- WHERE句はGROUP BY句よりも前に評価されるため、グループ化された結果を利用できません。
- HAVING句はGROUP BY句によってグループ化されたデータに対し、絞り込みの条件を指定することができます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
where句は group by句の前段階で行単位に対して実行されるフィルタ処理で, having句は group by句の後段階でグループ化単位に対して実行されるフィルタ処理。 -------- (C) SELECT cat_id, MAX(price) FROM itemlist WHERE cat_id = 20 GROUP BY cat_id は,次のような流れになります。 ↓ □where …cat_id = 20 の行だけを次段階へ送る ↓ □group by …cat_idでグループ化 (今回は,全行がcat_id=20なので1グループになります) ↓ □having …(無し) ↓ □select …グループ単位でmax(price)を表示 -------- > (B) SELECT cat_id, MAX(price) FROM itemlist > HAVING cat_id = 20 GROUP BY cat_id は間違いです。group by句とhaving句は次の順に指定しなければなりません。 SELECT cat_id, MAX(price) FROM itemlist GROUP BY cat_id HAVING cat_id = 20 上記の修正後は,次のような流れになります。 ↓ □where …(無し) ↓ □group by …cat_idでグループ化(複数グループになります) ↓ □having …cat_id=20のグループだけを次段階へ送る ↓ □select …グループ単位でmax(price)を表示 -------- > WHERE のターゲットがグループ関数で得られた値 > で条件指定するわけではないので文法的にも正しく > おなじ結果が得られる > こういう解釈でよろしいのでしょうか? はい,その解釈でよいでしょう。
お礼
お礼が遅れてしまい申しわけありません いつも解説していただきありがとうございます。 GROUP BY、HAVING の利用の仕方を教えていただき 参考にさせていただきます。 文法的な解釈のしかたについての あやふやな部分も確認していただき 理解を深めることができました。 貴重な時間をさいての回答、ありがとうございました。