DBデータベーススペシャリスト試験 午前Ⅱ
平成25年度春期 データベーススペシャリスト 午前Ⅱ 問5
問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。
問題
選択肢
- アSELECT 部門名 FROM 社員 GROUP BY 部門名 HAVING COUNT(*) >= 3 WHERE 役割名 = 'プログラマ'
- イSELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ' GROUP BY 部門名
- ウSELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 GROUP BY 部門名 HAVING 役割名 = 'プログラマ'
- エ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による補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針