PostgreSQLで複数のテーブルを結合するとき、INNER JOINとLEFT JOINのどちらを使うべきか迷うことがあります。特にNULLを含むデータを扱う場合、JOINの種類によって取得結果が大きく変わります。この記事では、PostgreSQLにおけるINNER JOINとLEFT JOINの違いや、NULLデータがどのように扱われるのか、実際の利用場面を交えながら分かりやすく解説します。
PostgreSQLのJOINとは何か
JOINとは、複数のテーブルを関連付けてデータを取得するためのSQL機能です。データベースでは、同じ情報を重複して保存しないように、顧客情報や注文情報などを別々のテーブルに分けて管理することが一般的です。
例えば、顧客情報を保存するcustomersテーブルと、注文履歴を保存するordersテーブルがある場合、顧客IDをキーにしてJOINすることで、顧客名と注文内容を同時に取得できます。
PostgreSQLではINNER JOINやLEFT JOINなど複数のJOIN方法がありますが、特に利用頻度が高いのがこの2種類です。
INNER JOINのNULLデータの扱い
INNER JOINは、結合条件が一致するデータだけを取得するJOINです。そのため、片方のテーブルに対応するデータが存在しない場合、その行は結果から除外されます。
例えば、以下のようなデータがあるとします。
| customers | orders |
|---|---|
| 田中 | 注文あり |
| 佐藤 | 注文あり |
| 鈴木 | 注文なし |
この状態でINNER JOINを実行すると、注文情報が存在する田中さんと佐藤さんだけが表示され、注文データがない鈴木さんは表示されません。
つまりINNER JOINでは、結合対象となるテーブルにNULLや対応するデータが存在しない場合、そのレコード自体が結果から消えるという特徴があります。
LEFT JOINのNULLデータの扱い
LEFT JOINは、左側に指定したテーブルのデータをすべて取得し、右側のテーブルに一致するデータがある場合だけ追加するJOINです。
一致するデータが存在しない場合でも左側のデータは残り、右側の列にはNULLが設定されます。
例えば、customersテーブルを左側にしてLEFT JOINを実行すると、注文履歴がない鈴木さんも表示されます。ただし、ordersテーブル側の注文日や商品情報などはNULLになります。
この仕組みにより、LEFT JOINでは「関連データが存在しない状態」も確認できます。
INNER JOINとLEFT JOINの結果の違いを比較
INNER JOINとLEFT JOINの大きな違いは、結合先にデータがない場合に元データを残すかどうかです。
| JOIN種類 | 一致データなしの場合 | NULLの扱い |
|---|---|---|
| INNER JOIN | 元データも表示されない | NULLになる前に除外される |
| LEFT JOIN | 左側データは表示される | 右側の列がNULLになる |
例えば、すべての会員一覧を表示したい場合はLEFT JOINが適しています。一方で、実際に購入履歴がある会員だけを対象に分析したい場合はINNER JOINが適しています。
LEFT JOINでNULLを利用した検索例
LEFT JOINは、NULLを利用して「存在しないデータ」を探す場合によく使われます。
例えば、会員登録はされているものの、一度も注文していないユーザーを取得したい場合は以下のようなSQLになります。
SELECT customers.name FROM customers LEFT JOIN orders ON customers.id = orders.customer_id WHERE orders.customer_id IS NULL;
このSQLでは、注文テーブルに一致するデータがないユーザーだけを取得できます。
このような使い方は、未処理データの確認や登録漏れの調査など、業務システムでも頻繁に利用されます。
INNER JOINを利用するべきケース
INNER JOINは、関連するデータが必ず存在することを前提とする処理に向いています。
例えば、商品の販売履歴を集計する場合、販売された商品のみを対象にしたいならINNER JOINが適しています。販売履歴がない商品まで表示する必要がない場合、余計なNULLデータを扱わずに済みます。
また、分析対象を限定したい場合にもINNER JOINは有効です。例えば、注文済み顧客だけを対象にした売上分析などが該当します。
LEFT JOINを利用するべきケース
LEFT JOINは、基準となる一覧をすべて表示したい場合に利用します。
例えば、全社員一覧に部署情報を追加する場合、部署未登録の社員がいても一覧から消えてはいけません。このような場合はLEFT JOINを利用すると、社員情報を維持したまま不足している部署情報をNULLとして確認できます。
システム開発では、「未登録」「未購入」「未対応」などの状態を確認するためにLEFT JOINが多く利用されます。
JOINを選択するときの判断基準
INNER JOINとLEFT JOINを選択するときは、まず「結合先にデータがない場合、その行を残す必要があるか」を考えることが重要です。
残す必要がない場合はINNER JOIN、残す必要がある場合はLEFT JOINを選択します。
例えば、顧客管理画面で全顧客を表示したい場合はLEFT JOIN、購入済み顧客だけを表示したい場合はINNER JOINというように、目的に合わせて使い分けます。
まとめ
PostgreSQLのINNER JOINとLEFT JOINでは、NULLを含むデータの扱いに大きな違いがあります。
INNER JOINでは結合条件に一致しないデータは結果から除外されます。一方、LEFT JOINでは左側のデータを保持し、対応するデータがない場合は右側の列がNULLになります。
データを完全に絞り込みたい場合はINNER JOIN、元の一覧を維持しながら関連情報を追加したい場合はLEFT JOINを利用すると判断しやすくなります。NULLが発生する意味を理解することで、より正確で効率的なSQLを作成できるようになります。


コメント