SQL設計・ウィンドウ関数・関係代数 重要度:★★★出題: AM2・PM1・PM2
外部結合(LEFT / RIGHT / FULL OUTER JOIN)とCOALESCE関数
がいぶけつごうとこあれすかんすう / Outer Join & COALESCE Function
結合相手のテーブルに一致する行が存在しない場合でも、基準となるテーブルの行を結果に残し、相手側の列をNULLで補完して出力する結合演算。
3行速習ポイント
- 内部結合(INNER JOIN)では実績が0件のマスタ行(例:PJ未参加の従業員や売上0件の商品)が結果から消えてしまうため、全マスタ行を出すにはOUTER JOINを使う
- 外部結合でNULLになった数値列を集計して「0」として表示するには `COALESCE(SUM(計画時間), 0)` のようにCOALESCE関数でNULLを0に置換する
- 結合相手テーブルに対する絞り込み条件を `WHERE` 句に書くと内部結合と同じ結果になってしまうため、外部結合の相手側条件は必ず `ON` 句に記述する
図解
図LEFT OUTER JOIN と COALESCE による全件集計
11. ON句での条件付き外部結合
LEFT JOIN左表(マスタ全件)を維持し、右表の不一致行はNULLで補完
22. 集合関数での集計
AggregateCOUNT(右表.列) や SUM(右表.列) でNULLを除いて集計
33. COALESCEで0変換
COALESCECOALESCE(SUM(数量), 0) により実績なし行のNULLを0へ変換
概要と本質
午後IのSQL設計設問(例:令和6年午後I問3の稼働計画・実績集計など)で毎年のように問われる超重要ポイントです。「なぜ内部結合ではなく外部結合にする必要があるのか」「なぜWHERE句ではなくON句に条件を書くのか」「なぜCOUNT(*)ではなくCOUNT(列名)やCOALESCEを使うのか」が頻出の論点です。
重要ポイント・コア概念
- COALESCE(引数1, 引数2, ...):引数を左から順に評価し、最初にNULLでない値を返す関数(SUMの結果がNULLになるとき0を返すのに必須)
- COUNT(*) と COUNT(右表.列名) の違い:外部結合後に `COUNT(*)` を使うと結合相手がNULLの行も「1件」と数えてしまうため、実績0件を0と数えるには `COUNT(右表.主キー)` を指定する
- ON句とWHERE句の罠:`LEFT OUTER JOIN B ON A.id = B.id AND B.年月 = 202510` はAの全行を残すが、`WHERE B.年月 = 202510` と書くとBがNULLの行が除外されてしまう
午後I・午後II記述試験での攻略ポイント
午後Iで「なぜこのSQLでは期待通り全従業員が出力されないのか」と問われたら、『PJに参加していない従業員も一部いるから(内部結合では稼働計画が存在しない従業員が抽出されないから)』または『WHERE句で絞り込むと外部結合でNULLとなった行が除外されるから』と答えます。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える