平成31年度 春期 応用情報技術者試験 午前 問28
テクノロジ/データベース過去3年分の記録を保存している “試験結果” 表から,2018年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得する SQL 文はどれか。ここで,実線の下線は主キーを表す。 試験結果(学生番号,受験年月日,点数,クラス名) ※ 学生番号,受験年月日 が主キー
出典:平成31年度 春期 応用情報技術者試験 午前 問28
- ア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')
正解:イ
解説
2018年度は受験年月日が 2018-04-01〜2019-03-31 の範囲なので,まず WHERE 句で行を絞り込みます。次にクラス名で GROUP BY し,グループごとの集計値に対する条件は HAVING 句で指定します。平均点数600点以上という条件はグループの平均なので HAVING AVG(点数) >= 600 と書きます。
選択肢ごとの解説
- ア誤り。年度による絞込みがないため,過去3年分すべての平均点数で判定してしまいます。
- イ正しい。WHERE 句で2018年度に限定し,クラス名でグループ化した上で HAVING AVG(点数) >= 600 とグループの平均で絞り込んでいます。
- ウ誤り。HAVING 句に集約関数でない「点数」を指定しており,GROUP BY で指定していない列をそのまま HAVING で使うことはできません。
- エ誤り。WHERE 点数 >= 600 で600点以上の答案だけを抽出しているため,クラス全体の平均点数を求めたことになりません。