PostgreSQLのINNER JOINとLEFT JOINの違いとは?NULLを含むデータの扱いと使い分けを解説

PostgreSQL

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を作成できるようになります。

コメント

タイトルとURLをコピーしました