ホーム > データベーススペシャリスト試験 > 2013年
データベーススペシャリスト試験 2013年 午前2 問05
社員表から、役割名がプログラマである社員が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 BY
やHAVING
の前に記述しなければなりません。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文となります。