ITサービスマネージャ 2018年 午前2 問21
問題文
“社員”表から、役割名がプログラマである社員が3人以上所属している部門の部門名を取得するSQL文はどれか。ここで、実線の下線は主キーを表す。
社員(社員番号、部門名、社員名、役割名)
選択肢
ア:SELECT 部門名 FROM 社員
GROUP BY 部門名
HAVING COUNT(*) >= 3
WHERE 役割名 = 'プログラマ'
イ:SELECT 部門名 FROM 社員
WHERE COUNT(*) >= 3
GROUP BY 部門名
HAVING 役割名 = 'プログラマ'
ウ:SELECT 部門名 FROM 社員
WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ'
GROUP BY 部門名
エ:SELECT 部門名 FROM 社員
WHERE 役割名 = 'プログラマ'
GROUP BY 部門名
HAVING COUNT(*) >= 3(正解)
🔒 解説は解答すると表示されます
WHERE句とHAVING句の使い分け【午前2解説】
正解の理由
正しいのはエです。
求めるのは、役割名が「プログラマ」である社員が3人以上所属する部門です。まずWHERE句でプログラマの社員に絞り込み、次にGROUP BY句で部門ごとにまとめ、最後にHAVING句で各部門の人数が3人以上かを判定します。
処理の順序は次のとおりです。
- WHERE句で「プログラマ」の社員を抽出する
- GROUP BY句で部門ごとにグループ化する
- HAVING句でグループ内の人数が3人以上の部門に絞る
解法ステップ
-
集計前の条件か、集計後の条件かを判断します。
「役割名がプログラマ」は、社員ごとに確認できる条件です。集計前にWHERE句で指定します。 -
人数を数える単位を決めます。
部門ごとの人数を調べるため、GROUP BY句に部門名を指定します。 -
集計結果に対する条件を指定します。
「3人以上」はグループ化して人数を数えた後の条件なので、HAVING句でCOUNT(*) >= 3と指定します。
選択肢別の誤答解説
- ア:WHERE句の位置が誤っています。WHERE句はGROUP BY句やHAVING句より前に記述します。また、役割名で絞り込んでいないため、COUNT(*)はプログラマ以外も含む社員数を数えてしまいます。
- イ:WHERE句では、COUNT(*)のような集計関数を条件にできません。また、役割名はグループ化後に判定する条件ではなく、集計前に絞り込む条件です。
- ウ:WHERE句でCOUNT(*)を条件にしている点が誤りです。集計結果に対する条件はHAVING句に指定します。
- エ:WHERE句でプログラマを抽出し、部門ごとにグループ化した後、HAVING句で人数が3人以上の部門を選んでいます。設問の条件に合致します。
よくある誤解
-
WHERE句とHAVING句は、どちらも条件を指定するため同じだと思う
WHERE句は集計前の行を絞り込み、HAVING句は集計後のグループを絞り込みます。 -
人数の条件もWHERE句に書けると思う
COUNT(*)などの集計結果を条件にする場合は、HAVING句を使います。 -
GROUP BY句とHAVING句の順序を混同する
基本的な記述順序は、WHERE句、GROUP BY句、HAVING句です。
補足コラム
この問題では、WHERE句でプログラマだけを残してから部門ごとに集計するため、COUNT(*)は各部門のプログラマの人数を表します。
社員番号が主キーであることから、社員表の1行は1人の社員を表しています。そのため、COUNT(*)で条件に該当する社員数を数えられます。
FAQ
Q. COUNT(*)とCOUNT(社員番号)は、ここでは同じですか?
A. 社員番号が主キーでNULLにならず、1行が1人の社員を表すため、この表では同じ人数を数えます。
A. 社員番号が主キーでNULLにならず、1行が1人の社員を表すため、この表では同じ人数を数えます。
Q. HAVING句だけで役割名を指定してはいけませんか?
A. この問題では、役割名は集計前に絞り込む条件です。WHERE句でプログラマだけに絞ってから人数を数えるのが適切です。
A. この問題では、役割名は集計前に絞り込む条件です。WHERE句でプログラマだけに絞ってから人数を数えるのが適切です。
Q. HAVING句はGROUP BY句がないと使えませんか?
A. SQLでは、GROUP BY句を使わずに集計結果に対する条件をHAVING句で指定することもあります。ただし、この問題のように部門ごとに判定する場合は、GROUP BY句が必要です。
A. SQLでは、GROUP BY句を使わずに集計結果に対する条件をHAVING句で指定することもあります。ただし、この問題のように部門ごとに判定する場合は、GROUP BY句が必要です。
関連キーワード: WHERE句、HAVING句、GROUP BY句、COUNT関数、集約】【。

\ せっかくなら /
ITサービスマネージャを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

