狙った分野の午後問題をやっつけたいよPart2・・・遊園地の入園者情報を管理する関係データベース『設問3』
#基本情報技術者試験 #平成28年 #春期 #午後 #データベース #SQL
設問2に引続きSQL文の問題、設問3。
大事そうなところをマークしていく。
すごく黄色~。
なので、「大事そうなところリスト」を作ってみた。
次に、SQL文をSELECTから順番に見ていく。
これは、大事そうなところリストの(4)。だからもう(4)は考えなくていい。
次はFROMで、ここには使いたい表が3つ書かれている。
使いたい表が二つ以上あるときは、WHEREでひもづけの条件が書かれるはず。
次はWHERE、色々書いてある。
まずはWHEREの一行目だけど、入園者番号どうしで、入園者表と利用表をつなげているところ。二つの表のひもづけ。
WHEREの二行目は、アトラクション番号どうしで、利用表とアトラクション表をつなげている。これも二つの表のひもづけ。
WHEREの三行目は、空欄なので飛ばして、ORDER BYのところ。
ORDER BYは並べ替えをするキーワード、DESCとつけると降順(大きい順)なので、支払金額の多い順に並べているのがここ。
大事そうなところリストの(3)はもう出来ているということだね。
ここまでで、大事そうなところリストのうち2つは、もう出来ているということがわかった。
リストの残り3つが実現できるやつを、解答群から見つけるぞ!お~!
解答群を見てみると、4つとも、出だしが「入園者表.券種 = '01'」になってるね。これでリストの(1)と(5)が出来ている。
残るのは(2)の、2,000円以上払った人が対象というやつ。
もう一度見てみると、4つ全部にGROUP BYがある。
GROUP BYはグループを作るんだったよね。
では、それをチェック。
GROUP BYに注目すると、
アとエ・・・アトラクションごとにグループを作っている
イとウ・・・入園者ごとにグループを作っている
という2パターンにわかれた。
どっちかに決めようと思う。
リストの(2)は、2,000円以上払った人だ。人なのだ!
だから、入園者(=人)ごとにグループを作って、料金の集計をしなきゃ。
もし、アトラクションごとにグループ作って、料金を集計したとしたら、2,000円以上の売上があったアトラクションってことになる。
よって、イかウのどっちか。
じゃあ、イとウの違いはどこか?
MAX(=最大値を求める)を使っているのがイ、SUM(=合計を求める)を使っているのがウ。
その人が2,000円以上払ったか?退園するときに精算したか?を調べたいので、払った料金の合計をしなきゃいけないよね。
ウにきまり。
今回はあまり気にしなくてよかったけど、HAVINGっていうのは、GROUP BYとか集合関数(AVG、SUMなどなど)と一緒に出てくるよね。WHEREと同じように絞り込みをしてくれるのがHAVINGなんだけど、グループごとの集計結果を絞り込み条件にしたいときは、HAVINGを使うよ。