基本情報

基本情報 平成31年度 春期 問27|テクノロジ系に関する問題

問題

基本情報 | 平成31年度 春期 | 分野:テクノロジ系

“中間テスト”表からクラスごと,教科ごとの平均点を求め,クラス名,教科名の昇順に表示するSQL文中のaに入れる字句はどれか。 中間テスト(クラス名,教科名,学生番号,名前,点数) 〔SQL文〕 SELECT クラス名, 教科名, AVG(点数) AS 平均点 FROM 中間テスト [ a ]

キーボード:1〜4で選択・Enterで次へ

タップするとすぐ答え合わせ

答え合わせ

正解は B
  • A
  • B
  • C
  • D

自信の3択

えらぶと、この端末に記録します(登録はいりません)

解説

答えは b です。

SQLでクラスごと・教科ごとの平均点を出すには:

1. GROUP BY クラス名, 教科名 で「クラス+教科」のグループに分ける

2. ORDER BY クラス名, 教科名 で見た目を並べ替える

「グループ分けの基準」と「並べ替えの基準」は同じものを使うのが基本。

👉 覚え方:GROUP BY=まとめる、ORDER BY=並べる。

ほかの選択肢:a は並べ替えに平均点を使っている/c はグループ分けに学生番号まで入れていて細かすぎる/d はグループ分けに教科名がなく、平均点でまとめようとしている。

なぜこれが正解か

正解は b。「クラスごと・教科ごとの平均点」を求めるには `GROUP BY クラス名, 教科名` で2つのキーでグルーピングし、AVG(点数) で平均を計算する。表示順は「クラス名, 教科名の昇順」と指定されているため `ORDER BY クラス名, 教科名` が必要。

```sql

SELECT クラス名, 教科名, AVG(点数) AS 平均点

FROM 中間テスト

GROUP BY クラス名, 教科名

ORDER BY クラス名, 教科名;

```

各選択肢の解説

  • a:GROUP BYは正しいが、ORDER BYに `AVG(点数)` が入っていて並び順が問題要求(クラス名・教科名昇順)と一致しない。
  • c:GROUP BYに学生番号を含めると個人別の細分化グループになり、クラス・教科の集計にならない。
  • d:GROUP BY に教科名がなく,集計結果の平均点をグループ化のキーにしているため,教科ごとの平均点にならない。

覚え方・ひっかけ注意

SQLの実行順序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。GROUP BYしたカラム以外をSELECTに書く場合は集約関数(AVG、SUM、COUNT等)で集約する必要がある(標準SQLの機能依存ルール)。これに違反するとMySQLでもONLY_FULL_GROUP_BYモードでエラー。

理論的背景

SQLの集約クエリは関係代数の射影+集約操作に対応。GROUP BYは指定列の組合せで関係を分割し、各分割に対して集約関数を適用する。集約関数は COUNT, SUM, AVG, MIN, MAX の基本5つに加え、SQL:2003以降は WINDOW関数(OVER句) で集約と詳細行を同時に扱える。

HAVING句との関係

GROUP BY後の集約結果に対する条件付けは HAVING句を使う(WHEREは集約前のフィルタ)。

```sql

SELECT クラス名, 教科名, AVG(点数) AS 平均点

FROM 中間テスト

GROUP BY クラス名, 教科名

HAVING AVG(点数) >= 60 -- 平均60点以上のクラス×教科のみ

ORDER BY クラス名, 教科名;

```

実行順序の詳細

論理的処理順序:①FROM/JOIN ②WHERE ③GROUP BY ④HAVING ⑤WINDOW ⑥SELECT ⑦DISTINCT ⑧ORDER BY ⑨LIMIT/OFFSET。これによりGROUP BY後のSELECTで定義したエイリアス(`AVG(点数) AS 平均点`)はORDER BY句で参照可能だがHAVING句では使えない(ただしPostgreSQL等の拡張で許容される実装もある)。

実務での使われ方

  • BIレポート:日次/月次/顧客別/商品別の集計はGROUP BY軸を増減して切替
  • OLAPキューブ:ROLLUP、CUBE、GROUPING SETSで多次元小計
  • ウィンドウ関数:ROW_NUMBER, RANK, LAG, LEAD, SUM() OVER (PARTITION BY...) で詳細行を保ちつつ集約
  • マテリアライズドビュー:頻繁な集約クエリを事前計算してキャッシュ

試験での位置づけ

基本情報のデータベース分野で必出。応用情報・データベーススペシャリストではJOIN(INNER/LEFT/RIGHT/FULL OUTER/CROSS)、相関サブクエリ、CTE(WITH句)、再帰CTE、ウィンドウ関数まで踏み込む。

選択肢の発展補足

GROUP BYに含まれない列をSELECTに書くと関数従属性を満たさない限りエラー(標準SQL)。MySQLは緩い実装で許容してきたが、5.7以降ONLY_FULL_GROUP_BYがデフォルト。NULLは1つのグループに集約されるが、集約関数では`COUNT(*)`を除き無視されるなど挙動差に注意。

この問題の根拠出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成31年度 春期 問27
訂正の記録この問題の訂正はありません(サイト全体の記録)
出典と作り方

出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成31年度 春期 問27/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビ独自の3段階の解説(初級・標準・上級)です。