SQL WHERE, HAVING について
こんにちは。さっそくですが、
白男川 恵さん著作による
「Oracle Master Bronze 演習問題 SQL基礎I」
の問95について質問させていただきます。
問題文
CAT_ID列の値が20であるPRICE列の最大値を求めたい。
実行すべきSQL文として正しいものを選びなさい。
とあり、正解は
(B) SELECT cat_id, MAX(price) FROM itemlist
HAVING cat_id = 20 GROUP BY cat_id
(C) SELECT cat_id, MAX(price) FROM itemlist
WHERE cat_id = 20 GROUP BY cat_id
なのですが、
WHERE句の使用法としては 大体の場合
WHERE (ターゲット) = (値)
となると思うのですが、ターゲットのところが
グループ関数でないのでこの場合は正解としてもよい、
ということでしょうか?
以下のサイトを別のタブで見ていただきたいのですが、
http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_1.html
「WHERE句とGROUP BY句を併用した場合、
WHERE → GROUP BYの順でクエリが評価されるため、
グループ化された結果をWHERE句の段階で利用できないのです。」
「HAVING句とGROUP BY句を利用した場合、
GROUP BY → HAVINGの順でクエリが評価され、
グループ化された結果に対し条件を指定することが可能です。」
http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_2.html
「HAVING句はGROUP BY句によってグループ化が行われたデータに対し、
絞り込みの条件を指定できます。
このため、絞り込み条件に集計関数を含めることが可能です。」
この設問の場合には
WHERE→GROUP BYの順でも
GROUP BY→HAVING
の場合でもWHERE のターゲットがグループ関数で得られた値
で条件指定するわけではないので文法的にも正しく
おなじ結果が得られる
こういう解釈でよろしいのでしょうか?
ご存知の方、教えていただけないでしょうか?
よろしくお願いします。
お礼
早速ありがとうございます。 文字列をくっつけて結果を表示させるなら、Where句ではなくselect の次に書くはずなのに、変だなと思っていたのですが、記載者のミスなのですね・・・お騒がせしました^^;