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

平成25年度春期 データベーススペシャリスト 午前Ⅱ 問5

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

問題

“社員”表から,役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文はどれか。ここで,実線の下線は主キーを表す。 社員(社員番号,部門名,社員名,役割名) 主キー:社員番号

選択肢

  1. ア
    SELECT 部門名 FROM 社員 GROUP BY 部門名 HAVING COUNT(*) >= 3 WHERE 役割名 = 'プログラマ'
  2. イ
    SELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ' GROUP BY 部門名
  3. ウ
    SELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 GROUP BY 部門名 HAVING 役割名 = 'プログラマ'
  4. エ
    SELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3
解き方のヒントを見る

抽出条件と結果を照合する視点

SQLの抽出条件と表示結果を対応づけるときは、条件がどの行や値の集合に影響するかを整理し、処理の各段階で確認します。特に条件の組合せと境界に注目し、個別の答えを先に決めずに読み進めます。

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

確認の中心は、抽出条件を構成する各要素が、対象となる行の範囲や組合せをどのように限定するかです。条件を分解して読み、適用対象と結果の対応を段階的に見比べてください。

視点

抽出条件は、対象データを段階的に眺めるための観点として整理し、条件の単位、組合せ、適用される範囲、境界付近の扱いを順に確認します。

確認ポイント

  • 条件を構成する要素を分け、各要素が確認対象に関係する箇所を整理する
  • 複数の条件が組み合わさる場合、条件同士の関係と境界となる値を確認する
  • 抽出前の対象と抽出後に残る対象を、個別の行や値ではなく対応関係として照合する
正解と解説を見る

正解

エ

解説

役割名がプログラマである行だけを先に対象とし、部門名でグループ化した後、各部門の行数が3以上のグループをHAVINGで抽出する。したがって正しいSQLはエです。

理由

WHEREはGROUP BYの前に個々の行を絞り込むため、役割名がプログラマの社員だけを対象にする。次に部門名でグループ化し、COUNT(*)で各部門に該当者が何人いるかを数える。

比較

集約関数COUNT(*)による3人以上という条件は、グループ化後の結果に対する条件なのでHAVINGで指定する。WHEREに集約条件を置いたり、HAVINGに行単位の条件を置いたりすると、SQLの処理段階と合わない。

選択肢ア

これは不正解だよ。GROUP BYとHAVINGの後にWHEREを記述しており、SQLの句の順序が不適切である。また、役割名の条件を先に適用できないため、COUNT(*)がプログラマ以外の社員も含む部門全体の人数を数えてしまう。

選択肢イ

これは不正解だよ。WHERE句はGROUP BYより前に行を絞り込む句だが、COUNT(*)のような集約関数による条件を指定する場所ではない。集約後の人数を条件にするには、グループ化後を対象とする句を使う必要がある。

選択肢ウ

これは不正解だよ。WHERE句でCOUNT(*)を使っており、グループ化前の個々の行に対して集約結果を判定しようとしている。また、役割名は行を絞り込む条件なので、部門ごとの集約結果を判定する句に置く内容ではない。

選択肢エ(正解)

これは正解だよ。WHERE句で役割名がプログラマの社員だけを先に抽出し、GROUP BY句で部門ごとにまとめている。その後、HAVING句で各部門のCOUNT(*)が3以上のグループだけを残すため、設問の条件を正しく満たしている。

学習のポイント

WHEREとHAVINGの役割、およびGROUP BYと集約関数の処理順序を理解する。

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

関連する過去問一覧

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