戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

データベーススペシャリスト試験 2013年 午前205


問題文

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

選択肢

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
(正解)

社員表から役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文【午前2 解説】

要点まとめ

  • 結論:役割名が「プログラマ」の社員を絞り込み、部門ごとにグループ化して3人以上の部門名を抽出するには「WHERE → GROUP BY → HAVING」の順で記述します。
  • 根拠:WHERE句は行単位の絞り込み、GROUP BYは集約の単位設定、HAVINGはグループ単位の条件指定に使うため、正しい順序で使う必要があります。
  • 差がつくポイント:HAVING句で集約関数COUNT(*)を使い、WHERE句で役割名を先に絞ること。誤った句の順序や集約関数の使い方に注意しましょう。

正解の理由

選択肢エは、まずWHERE句で「役割名='プログラマ'」の条件で社員を絞り込み、その後「部門名」でグループ化し、HAVING句で「COUNT(*) >= 3」の条件を指定しています。これにより、プログラマが3人以上いる部門名だけを正確に抽出できます。SQLの基本的な句の使い方に忠実であり、論理的に正しい構文です。

よくある誤解

WHERE句で集約関数を使えると思い込むことや、HAVING句の前にWHERE句を置かずに誤った順序で書くミスが多いです。集約関数はHAVING句で使うことを理解しましょう。

解法ステップ

  1. 役割名が「プログラマ」の社員だけを抽出するためにWHERE句を使う。
  2. 部門名ごとに社員をグループ化するためにGROUP BY句を使う。
  3. グループ化した部門の中で、プログラマの人数が3人以上の条件をHAVING句で指定する。
  4. SELECT句で部門名を取得する。

選択肢別の誤答解説

  • ア:WHERE句はGROUP BYの前に書く必要があり、HAVING句の前にWHERE句が来るため構文エラー。
  • イ:WHERE句内で集約関数COUNT(*)を使っているため文法エラー。WHERE句は行単位の条件指定のみ。
  • ウ:WHERE句でCOUNT(*)を使っているのは誤り。HAVING句で集約関数を使うべき。
  • :正解。WHERE句で役割名を絞り、GROUP BYで部門ごとにまとめ、HAVING句で3人以上の条件を指定している。

補足コラム

SQLの句の処理順序は「FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY」です。WHERE句は集約前の行を絞り込み、HAVING句は集約後のグループに条件を付けるため、集約関数はHAVING句で使うのが基本です。これを理解すると複雑な集計クエリも正しく書けます。

FAQ

Q: WHERE句で集約関数を使えますか?
A: いいえ、WHERE句は行単位の条件指定に使い、集約関数はHAVING句で使います。
Q: HAVING句は必ずGROUP BY句とセットで使うのですか?
A: はい、HAVING句はグループ化した結果に条件を付けるため、GROUP BY句が必要です。
Q: COUNT(*)は何を数えますか?
A: グループ内の行数(レコード数)を数えます。NULLも含めてカウントします。

関連キーワード: SQL, WHERE句、HAVING句、GROUP BY句、集約関数、COUNT, 部門集計、プログラマ抽出
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ

プライバシーポリシー利用規約開発者について