応用情報技術者 2019年 春期 午前2 問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')
過去3年分の記録から2018年度の平均点数600点以上のクラス名と平均点数を取得するSQL【午前2 解説】
要点まとめ
- 結論:2018年度の期間で絞り込み、クラスごとに平均点を計算し600点以上のクラスを抽出するには選択肢イが正解です。
- 根拠:WHERE句で2018年度の受験年月日を指定し、GROUP BYでクラス名ごとに集計、HAVING句で平均点600点以上を条件にしています。
- 差がつくポイント:期間指定をWHERE句で行い、HAVING句では集計結果に対する条件を正しく記述することが重要です。
正解の理由
選択肢イは、まずWHERE句で2018年度(2018-04-01から2019-03-31まで)の受験データに絞り込み、その後クラス名ごとに平均点を計算しています。最後にHAVING句で平均点が600点以上のクラスのみを抽出しており、問題文の条件を正確に満たしています。
よくある誤解
- WHERE句で期間指定をしないと、全期間のデータが対象になり誤った平均点が算出されます。
- HAVING句は集計結果に対する条件指定であり、集計前の列に対して使うのは誤りです。
解法ステップ
- 2018年度の期間を明確に定義し、WHERE句で受験年月日を絞り込む。
- クラス名ごとにグループ化するためGROUP BY句を使う。
- 各クラスの平均点をAVG関数で計算する。
- HAVING句で平均点が600点以上のクラスを抽出する。
- クラス名と平均点をSELECT句で取得する。
選択肢別の誤答解説
- ア:期間指定がなく全期間の平均点を計算しているため、2018年度の条件を満たしていません。
- イ:正解。期間指定と集計条件が正しく記述されています。
- ウ:HAVING句で集計結果ではなく点数そのものに条件を付けており文法的に誤りです。
- エ:WHERE句で点数600点以上に絞り込んでいるため平均点の計算が正しくなく、HAVING句の条件も誤っています。
補足コラム
SQLの集計処理では、WHERE句は集計前の行を絞り込むために使い、HAVING句はGROUP BYでまとめた後の集計結果に条件を付けるために使います。期間指定などのフィルタリングは基本的にWHERE句で行い、集計結果の条件はHAVING句で指定するのが正しい使い分けです。
FAQ
Q: なぜ期間指定はWHERE句で行うのですか?
A: WHERE句は集計前の行を絞り込むため、対象データを正しく限定することで正確な集計結果が得られます。
A: WHERE句は集計前の行を絞り込むため、対象データを正しく限定することで正確な集計結果が得られます。
Q: HAVING句で集計関数以外の列に条件を付けられますか?
A: HAVING句は集計結果に対する条件指定なので、集計関数を使わない列に条件を付けるのは誤りです。
A: HAVING句は集計結果に対する条件指定なので、集計関数を使わない列に条件を付けるのは誤りです。
関連キーワード: SQL, 集計関数、WHERE句、HAVING句、GROUP BY, 平均点、期間指定

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

