ホーム > データベーススペシャリスト試験 > 2015年
データベーススペシャリスト試験 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')
解説
# 問題解説:2014年度の平均点数が600点以上となったクラス名と平均点数を取得するSQL文
---
## 問題のポイント
- **対象データ**:「試験結果」表
- **条件**:
- 2014年度の試験結果(2014年4月1日~2015年3月31日の期間)に限定
- 各クラスの平均点数
- 平均点数が600点以上のクラスを抽出すること
---
## テーブル構造の確認
| カラム名 | 意味 | 備考 |
|---------|------------|---------------------|
| 学生番号 | 主キー | 学生ごとの識別子 |
| 受験年月日 | 試験を受けた日 | 日付で年月日形式 |
| 点数 | 試験の得点 | 数値 |
| クラス名 | クラス名 | クラスの識別子 |
---
## SQL文に必要な要素
1. **抽出期間の指定**
受験年月日が2014年度(2014年4月1日から2015年3月31日)の範囲であるデータに絞るため、`WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'` とする。
※日付の指定はWHERE句の中に記述する。
2. **クラスごとにグルーピング**
クラス単位で平均点を計算するため、`GROUP BY クラス名`。
3. **平均点数の集計と条件指定**
集計関数`AVG(点数)`で平均点を算出し、600点以上のクラスを抽出するために`HAVING AVG(点数) >= 600` という条件を付ける。
---
## 各選択肢の検証
- **ア**
```sql
SELECT クラス名, AVG(点数) FROM 試験結果
GROUP BY HAVING AVG() >= 600
-
文法エラー多数
-
GROUP BY
に列指定なし -
HAVING AVG()
は関数の引数が抜けている -
不正解
-
イ
SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600
WHERE
句で2014年度のデータを正しく絞り込みGROUP BY クラス名
によりクラス別に集計HAVING AVG(点数) >= 600
で平均点が600点以上をフィルター- 正しいSQL文
-
ウ
SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31' GROUP BY クラス名 HAVING 点数 >= 600
HAVING
句は集計後の条件に使うため、「点数 >= 600」は無意味で誤り- 平均点に対する条件ではない
- 日付の後のシングルクォート位置も誤り(
'2015-03-31'
) - 不正解
-
エ
SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 点数 >= 600 GROUP BY クラス名 HAVING (MAX(受験年月日) BETWEEN '2014-04-01' AND '2015-03-31')
WHERE
で点数600点以上のみに限定しているが、これは平均点に必要なフィルタではないHAVING
句の条件は「最新の試験日が2014年度内かどうか」であるが、対象期間の絞り込みとして不正確- 受験日全体から2014年度を抽出すべきで、「MAX(受験年月日)」では部分的な判定しかできない
- 不正解
まとめ
- 2014年度の試験データだけ抽出するために
WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'
が必要 - クラス名ごとにグルーピングし、クラスごとの平均点を計算
HAVING
句で平均点数が600点以上のクラスを抽出- 正しいSQLは「イ」となります。
正解SQL(イ)
SELECT クラス名, AVG(点数)
FROM 試験結果
WHERE 受験年月日 BETWEEN '2014-04-01' AND '2015-03-31'
GROUP BY クラス名
HAVING AVG(点数) >= 600;
以上の理由より、選択肢イが正解です。