平成31年度 春期 午前 問28
データベース
過去 3 年分の記録を保存している "試験結果" 表から,2018 年度の平均点数が 600 点以上となったクラスのクラス名と平均点数の一覧を取得する SQL 文はどれか。ここで,実線の下線は主キーを表す。
試験結果(学生番号,受験年月日,点数,クラス名)
- ア`SELECT クラス名, AVG(点数) FROM 試験結果 GROUP BY クラス名 HAVING AVG(点数) >= 600`
- イ`SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600`
- ウ`SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING 点数 >= 600`
- エ`SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 点数 >= 600 GROUP BY クラス名 HAVING (MAX(受験年月日) BETWEEN '2018-04-01' AND '2019-03-31')`
答えと解説を見る
✓ これが正解イ`SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600`
解説
年度で絞ってからクラス別に集計し、平均で選別します。
3年ぶんの記録が入っている表から、ある年度だけを対象にして、さらにクラス別の平均を求めて絞り込む問題です。SQL の並びで押さえるのは三点あります。まず、対象の行を年度で絞ります。ここは行ごとの受験年月日を範囲で切るのが素直で、集計より前の段階で書きます。次に、クラス単位に束ねます。GROUP BY にクラス名を置くと、同じクラスの行がひとまとまりになります。最後に、束ねた結果に対して条件を掛けます。ここで見るのはクラスごとの平均点数で、AVG による集計の結果を HAVING で受け取り、600 点以上のクラスだけ残します。この三段を、絞る、束ねる、集計して切る、の順に踏むのが正しい書き方です。
ほかの選択肢はなぜ違うのか
- ア`SELECT クラス名, AVG(点数…:年度で絞る条件を書かずに、全期間のデータから GROUP BY と HAVING を回すと述べています。3年ぶんの記録がそのまま平均に混ざるので、2018 年度だけを取り出す条件を満たしません。
- ウ`SELECT クラス名, AVG(点数…:HAVING の条件を集計値ではなく素の点数の比較で書くと述べています。HAVING は集計後の結果に対して働く節で、AVG を通していない点数の値を並べても、平均で絞る指定にはなりません。
- エ`SELECT クラス名, AVG(点数…:WHERE で点数が 600 以上の行だけを取り出してから、HAVING に受験年月日の MAX を持ち込むと述べています。これは行を先に間引いてしまう向きで、クラスの平均を 600 以上で切る動きにはなりません。
出典:平成31年度 春期 応用情報技術者試験 午前 問28
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)