データベーススペシャリスト試験 2015年 午前2 問07
過去3年分の記録を保存している“試験結果”表から, 2014年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで、実線の下線は主キーを表す。
試験結果(学生番号、受験年月日、点数,クラス名)
ア:
SELECT クラス名, AVG (点数) FROM 試験結果
GROUP BY HAVING AVG() >= 600
イ:
SELECT クラス名, AVG (点数) FROM 試験結果
WHERE BETWEEN '2014-04-01' AND '2015-03-31'
GROUP BY 57 HAVING AVG() >= 600
(正解)ウ:
SELECT クラス名, AVG (点数) FROM 試験結果
WHERE BETWEEN '2014-04-01' AND 2015-03-31'
GROUP BY クラス名 HAVING 点数 >= 600
エ:
SELECT クラス名, AVG(点数) FROM 試験結果
WHERE 点数 >= 600
GROUP BY クラス名
HAVING (MAX(受験年月日) BETWEEN '2014-04-01' AND '2015-03-31')
解説
過去3年分の記録から2014年度の平均点数600点以上のクラス名と平均点数を取得するSQL文【午前2 解説】
要点まとめ
- 結論:2014年度の期間で絞り込み、クラスごとに平均点を計算し600点以上のクラスを抽出するSQL文はイです。
- 根拠:WHERE句で受験年月日を2014年度に限定し、GROUP BYでクラス名ごとに集計、HAVING句で平均点600点以上を条件にしています。
- 差がつくポイント:日付の範囲指定、GROUP BYの正しい記述、HAVING句で集計関数を使った条件指定が正確かどうかが重要です。
正解の理由
イのSQL文は、まず
その後、
WHERE
句で受験年月日を2014年度(2014年4月1日から2015年3月31日まで)に絞り込み、GROUP BY クラス名
でクラスごとに集計しています。その後、
HAVING AVG(点数) >= 600
で平均点が600点以上のクラスだけを抽出しているため、問題文の条件を正確に満たしています。よくある誤解
- WHERE句の書き方やBETWEENの使い方を誤り、日付範囲が正しく指定できていないことが多いです。
- HAVING句で集計関数を使わずに単純な列名で条件を指定し、正しく絞り込めないケースがあります。
解法ステップ
- 2014年度の期間を
受験年月日
で絞り込むため、WHERE
句にBETWEEN '2014-04-01' AND '2015-03-31'
を指定する。 - クラスごとに平均点を計算するため、
GROUP BY クラス名
を使う。 - 平均点が600点以上のクラスを抽出するため、
HAVING AVG(点数) >= 600
を指定する。 - SELECT句で
クラス名
とAVG(点数)
を出力する。
選択肢別の誤答解説ステップ
- ア:
GROUP BY
の後に対象の列がなく、HAVING AVG()
の括弧内も空で文法エラー。 - イ:正解。日付範囲指定、グループ化、平均点条件が正しく記述されている。
- ウ:
WHERE BETWEEN
の書き方が誤り(BETWEENの前に列名がない)、HAVING 点数 >= 600
は集計関数を使っていないため誤り。 - エ:
WHERE 点数 >= 600
で点数で絞り込んでしまい、平均点600点以上のクラス抽出にはならない。HAVING
句の条件も誤用。
補足コラム
SQLで集計結果に条件を付ける場合は
また、日付の範囲指定は
WHERE
句で行単位の絞り込み、HAVING
句でグループ化後の集計結果に対する条件指定を行います。また、日付の範囲指定は
BETWEEN
を使う際に対象の列名を必ず明記し、文字列の引用符や括弧の閉じ忘れに注意しましょう。FAQ
Q: なぜ
A:
HAVING
句でAVG(点数) >= 600
と書くのですか?A:
HAVING
句はグループ化後の集計結果に条件を付けるため、平均点のような集計関数を使った条件はHAVING
で指定します。Q:
A:
WHERE
句で日付範囲を指定する理由は?A:
WHERE
句は集計前の行を絞り込むため、対象年度のデータだけを抽出してから集計する必要があるからです。関連キーワード: SQL, 集計関数, HAVING句, GROUP BY, 日付範囲指定, 平均点, データ抽出