社員表から役割名がプログラマである社員が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句で使うことを理解しましょう。
解法ステップ
- 役割名が「プログラマ」の社員だけを抽出するためにWHERE句を使う。
- 部門名ごとに社員をグループ化するためにGROUP BY句を使う。
- グループ化した部門の中で、プログラマの人数が3人以上の条件をHAVING句で指定する。
- 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, 部門集計、プログラマ抽出