ホーム > データベーススペシャリスト試験 > 2013年

データベーススペシャリスト試験 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
(正解)

解説

# 問題の理解

このSQL問題では、「社員」テーブルから「役割名」が「プログラマ」である社員が3人以上いる部門の「部門名」を取得することが求められています。

テーブル構造:
- 社員(社員番号<u>(主キー)</u>,部門名,社員名,役割名)

---

# 正解のSQL文

**エ:**
```sql
SELECT 部門名 FROM 社員
WHERE 役割名 = 'プログラマ'
GROUP BY 部門名
HAVING COUNT(*) >= 3

解説

1. WHERE句の役割

WHERE 役割名 = 'プログラマ' は、まず「プログラマ」だけのレコードに絞り込みます。
これにより、それ以外の役割の社員は集計対象から外れます。

2. GROUP BYの役割

GROUP BY 部門名 は、「部門名」ごとにデータをまとめます。
つまり、各部門の「プログラマ」の数を集計可能にします。

3. HAVING句の役割

HAVING COUNT(*) >= 3 は、グループ(部門)ごとの集計後に「プログラマ」の人数が3人以上の部門だけを抽出します。
HAVINGはGROUP BYの後に条件を指定するための句であり、集計結果(COUNTなど)に対して条件をかけられます。

なぜ他の選択肢は誤りか

  • ア:
SELECT 部門名 FROM 社員
GROUP BY 部門名
HAVING COUNT(*) >= 3
WHERE 役割名 = 'プログラマ'
→ SQLの文法順序が誤りです。WHERE句はGROUP BYHAVINGの前に記述しなければなりません。HAVINGの前にWHEREは書けません。
  • イ:
SELECT 部門名 FROM 社員
WHERE COUNT(*) >= 3 AND 役割名='プログラマ'
GROUP BY 部門名
WHERE句の中で集計関数COUNT(*)は使えません。
集計関数に関する条件はHAVING句に記述する必要があります。
  • ウ:
SELECT 部門名 FROM 社員
WHERE COUNT(*) >= 3
GROUP BY 部門名
HAVING 役割名 = 'プログラマ'
WHERE句で集計関数を使っているのは誤りです(解説は上記参照)。
また、HAVING 役割名 = 'プログラマ'は誤りです。HAVINGはグループ化された後の集計結果に対して条件をかけるものなので、文字列比較はグループの代表値がなければ意味がありません。役割名は個別の行の情報なのでWHERE句でフィルタリングすべきです。

まとめ

  • 集計関数を使った条件はHAVING句で指定する。
  • 集計前の行単位の条件はWHERE句で指定する。
  • 集計はGROUP BY句で行う。
  • よって、「プログラマ」の社員のみをWHEREで絞り込んでから、GROUP BYで部門ごとにグループ化し、HAVINGで人数条件(3人以上)を指定するエの文が適切。

以上の理由により、 正解は「エ」 のSQL文となります。
← 前の問題へ次の問題へ →

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