departments表とemployees表は次のとおりである。SQLの結果で、dept_idが1、2、3の順に並んだ人数はどれか。employee_idは主キーである。 departments dept_id | name 1 | 営業 2 | 開発 3 | 総務 employees employee_id | dept_id 101 | 1 102 | 1 103 | 2 SELECT d.dept_id, COUNT(e.employee_id) FROM departments d LEFT JOIN employees e ON d.dept_id = e.dept_id GROUP BY d.dept_id ORDER BY d.dept_id;
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:ア 2、1、0
この表示だけでは、回答数や正答率は変わりません。
解説
LEFT JOINは左側の部署をすべて残します。部署1には社員2人、部署2には社員1人が対応します。部署3には対応する社員がいないため、結合結果の社員列はNULLになります。COUNT(e.employee_id)はNULLを数えないので、部署3の人数は0です。
部署1は2人、部署2は1人、部署3は対応する非NULLの社員IDがなく0人です。
部署3でCOUNT(*)を使った場合には1になりますが、このSQLは社員IDを数えています。
部署1には社員101と102の2人がいます。GROUP BYしても人数は失われません。
ON句で部署IDを照合するので、全社員を各部署に結び付けるわけではありません。
関連知識
内部結合では対応する社員のいない部署3は結果に現れません。左外部結合とCOUNT(右表の主キー)を組み合わせると、該当件数0の対象も一覧にできます。
間違えやすいポイント
外部結合でできたNULLの行を、実際の社員1人と数えないこと。COUNT(*)とCOUNT(列)を区別します。
覚え方
左は残す。右の非NULLキーを数える。
実務での意味
注文が一度もない商品や、担当者が未配置の部署も含めて集計する画面に利用できます。
解説:本サイト編集部によるオリジナル文章