-PR-
  • 暇なときにでも
  • 質問No.7647673
解決
済み

SQL WHERE, HAVING について

  • 閲覧数407
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

こんにちは。さっそくですが、
白男川 恵さん著作による
「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 のターゲットがグループ関数で得られた値
で条件指定するわけではないので文法的にも正しく
おなじ結果が得られる

こういう解釈でよろしいのでしょうか?
ご存知の方、教えていただけないでしょうか?
よろしくお願いします。
  • 回答数1
  • 気になる数0

質問者が選んだベストアンサー

  • 回答No.1
レベル14

ベストアンサー率 61% (1597/2589)

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 のターゲットがグループ関数で得られた値
> で条件指定するわけではないので文法的にも正しく
> おなじ結果が得られる
> こういう解釈でよろしいのでしょうか?

はい,その解釈でよいでしょう。
お礼コメント
noname#173931

お礼が遅れてしまい申しわけありません
いつも解説していただきありがとうございます。
GROUP BY、HAVING の利用の仕方を教えていただき
参考にさせていただきます。
文法的な解釈のしかたについての
あやふやな部分も確認していただき
理解を深めることができました。
貴重な時間をさいての回答、ありがとうございました。
投稿日時 - 2012-08-20 20:16:56
  • ありがとう数0
-PR-
-PR-
  • 回答数1
  • 気になる数0
このQ&Aで解決しましたか?

関連するQ&A

-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


-PR-

ピックアップ

-PR-
ページ先頭へ