DBデータベーススペシャリスト試験 午前Ⅱ

平成23年度特別 データベーススペシャリスト 午前Ⅱ 問6

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

次のSQL文によって“会員”表から新たに得られる表はどれか。
グループごとの平均年齢を求めるSQL文,6人の会員表,及び四つの結果表候補。
グループごとの平均年齢を求めるSQL文,6人の会員表,及び四つの結果表候補。

選択肢

  1. ア
    図ア
  2. イ
    図イ
  3. ウ
    図ウ
  4. エ
    図エ
解き方のヒントを見る

SQL抽出条件を読むための着眼点

SQLの抽出条件と結果の対応を考えるときは、文の各条件がどの対象を判定しているかを整理し、条件同士の関係と適用される段階に注目して、順序立てて確認します。

この問題で問われていること

一つの確認に絞り、抽出条件が対象のどの属性や行に対して評価されるものかを、文全体の構造と照らして整理してみましょう。

視点

SQL文を読む際は、対象を選ぶ部分と条件を判定する部分の役割を分けて捉えます。条件のまとまりごとに、何を対象に評価するのかを言葉で置き換え、結果との対応を落ち着いて確認しましょう。

確認ポイント

  • 各条件が参照している対象や属性を整理する
  • 条件のまとまりと文全体の構造を対応づける
  • 結果に含まれる対象を条件ごとの観点で確認する
正解と解説を見る

正解

ウ

解説

GROUP BY グループで同じグループの会員をまとめ、HAVING COUNT(*) > 1で会員数が2人以上のグループだけを残す。その各グループの年齢平均が結果となる。

理由

グループBの年齢は20歳と40歳なので、平均は (20歳+40歳)÷2人=30歳です。グループCの年齢は30歳、40歳、50歳なので、平均は (30歳+40歳+50歳)÷3人=40歳です。グループAは1人だけなので、COUNT(*) > 1を満たさず結果から除かれます。したがって、結果は30と40の2行です。

比較

SELECT AVG(年齢)はグループごとの平均年齢を求め、GROUP BY グループによってグループ単位の行を作ります。HAVING COUNT(*) > 1は、集計後の各グループについて人数が2人以上かを判定します。会員全体の平均や個々の年齢をそのまま出す処理ではありません。

選択肢ア

これは不正解だよ。図アはAVG(年齢)の値を36だけ示していますが、SQLはグループ別に集計し、人数が2人以上のグループを残します。該当する複数グループの平均を1つにまとめる処理ではないため、結果の行数と値の構成が設問の条件と一致しません。

選択肢イ

これは不正解だよ。図イはAVG(年齢)の値を40だけ示しています。40という平均値だけを持つグループがあっても、SQLは条件を満たす各グループを別々に出力します。複数の対象グループのうち一方だけを残す表なので、GROUP BYとHAVINGの結果とは一致しません。

選択肢ウ(正解)

これは正解だよ。グループBは (20歳+40歳)÷2人=30歳、グループCは (30歳+40歳+50歳)÷3人=40歳です。どちらもCOUNT(*) > 1を満たします。一方、グループAは1人なので除外され、結果はAVG(年齢)が30と40の2行になります。

選択肢エ

これは不正解だよ。図エは60、30、40という年齢を並べていますが、SQLのSELECT項目はAVG(年齢)であり、個々の会員の年齢を出力しません。また、グループAの60歳は人数が1人でHAVING条件を満たさないため、結果に含めることはできません。

学習のポイント

GROUP BY、HAVING、COUNT、AVGの処理順と結果行の単位を理解する。

出典:独立行政法人 情報処理推進機構(IPA)平成23年度特別 データベーススペシャリスト試験 午前Ⅱ 問6(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針