コマンド道場
LEFT / RIGHT OUTER JOIN難易度 ★★★☆☆

社員が 0 人の部署も出す

busho テーブルのすべての部署について、所属する社員の人数を取り出してください。社員が 1 人もいない部署は 0 と表示してください。退職者も人数に含めます。列名は人数が ninzu で、列は「busho_name, ninzu」の順、人数の多い順、同じ人数なら busho_name の昇順に並べてください。

主要 7 製品で通用 そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database / IBM Db2

製品ごとの対応表(実測)を見る

  • LEFT OUTER JOIN は左の表の行をすべて残し、相手がいなければ NULL で埋めます。
  • ⚠️ count(*) と書くと、相手がいない行も 1 と数えてしまいます。count(結合先の列) なら NULL を数えないので 0 になります。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

0 件を 0 と出すには、外部結合と count(列) の両方が要ります。

なぜ

外部結合だけでは足りません。相手がいない行も 1 行として残るので、count(*) は 1 を返してしまいます。count は引数が NULL の行を数えないので、結合先の列を渡すと 0 になります。

このデータには社員が 1 人もいない部署(法務)があります。内部結合にするとこの部署が消え、count(*) にすると 1 人と表示されます。どちらもエラーにならないので、0 件が正しく 0 と出ているかを必ず目で確かめてください。

よくある間違い

①内部結合にして 0 件の行が消える ②count(*) にして 0 が 1 になる。

LEFT / RIGHT OUTER JOIN の使い方をはじめから読む

根拠(一次情報)