SQL Serverで複数のテーブルからデータを取得するとき、JOINは欠かせない機能です。しかし、INNER JOINとLEFT JOINのどちらを使えばよいのか迷うケースは少なくありません。この記事では、それぞれのJOINの仕組みや違い、実際の業務システムでの使い分け基準について、具体例を交えながら分かりやすく解説します。
SQL ServerのJOINとは何か
JOINとは、複数のテーブルを関連付けて1つの結果として取得するためのSQLの機能です。データベースでは、同じ情報を何度も保存しないようにテーブルを分割して管理することが一般的です。
例えば、顧客情報を管理する「Customersテーブル」と注文情報を管理する「Ordersテーブル」がある場合、顧客IDをキーとして2つのテーブルを結合することで、顧客名と注文内容を同時に取得できます。
SQL ServerではINNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINなど複数の結合方法がありますが、特によく利用されるのがINNER JOINとLEFT JOINです。
INNER JOINの特徴と利用する場面
INNER JOINは、結合条件に一致するデータだけを取得するJOINです。つまり、両方のテーブルに対応するデータが存在する場合のみ結果として表示されます。
例えば、以下のような顧客テーブルと注文テーブルがあるとします。
| Customers | Orders |
|---|---|
| 田中さん | 注文あり |
| 佐藤さん | 注文あり |
| 鈴木さん | 注文なし |
この状態でINNER JOINを使用すると、注文が存在する田中さんと佐藤さんだけが取得され、注文履歴がない鈴木さんは結果から除外されます。
そのため、INNER JOINは「関連するデータが存在するものだけ欲しい」という場合に適しています。
LEFT JOINの特徴と利用する場面
LEFT JOINは、左側に指定したテーブルのデータをすべて取得し、右側のテーブルに一致するデータがあれば追加する結合方法です。一致するデータがない場合でも、左側のデータは残ります。
先ほどの顧客情報を例にすると、LEFT JOINを利用した場合は注文履歴がない鈴木さんも表示されます。その場合、注文情報の部分はNULLになります。
つまりLEFT JOINは「元になる一覧はすべて表示したいが、関連情報があれば追加したい」という場合に利用します。
INNER JOINとLEFT JOINの使い分け基準
INNER JOINとLEFT JOINを選択するときの基本的な判断基準は、「関連データが存在しない場合、そのデータを結果に残す必要があるか」です。
| 目的 | 適したJOIN |
|---|---|
| 関連データがあるものだけ取得したい | INNER JOIN |
| 元データをすべて表示したい | LEFT JOIN |
| 未登録や未処理のデータを確認したい | LEFT JOIN |
例えば、売上分析で「商品ごとの販売履歴」を確認する場合、販売された商品のみを確認したいならINNER JOINが適しています。
一方で「登録されている全商品を一覧表示し、その中でまだ売れていない商品も確認したい」という場合はLEFT JOINを使用します。
実際のSQLで比較するINNER JOINとLEFT JOIN
INNER JOINの場合は以下のようなSQLになります。
SELECT Customers.Name, Orders.OrderDate FROM Customers INNER JOIN Orders ON Customers.ID = Orders.CustomerID;
このSQLでは、注文データが存在する顧客だけが表示されます。
LEFT JOINの場合は以下のようになります。
SELECT Customers.Name, Orders.OrderDate FROM Customers LEFT JOIN Orders ON Customers.ID = Orders.CustomerID;
こちらでは、注文がない顧客も表示され、注文日時の部分がNULLになります。
この違いを理解すると、例えば「注文していない顧客を探す」といった処理も簡単に作成できます。
LEFT JOINでNULLを活用するケース
LEFT JOINは、存在しないデータを調査するときにも非常に便利です。
例えば、以下のようなSQLでは、注文履歴がない顧客を取得できます。
SELECT Customers.Name FROM Customers LEFT JOIN Orders ON Customers.ID = Orders.CustomerID WHERE Orders.CustomerID IS NULL;
このようにLEFT JOIN後にNULLを条件として利用することで、「未登録」「未実施」「対象外」といったデータを見つけることができます。
JOIN選択時に注意すべきポイント
JOINを間違えると、取得件数が想定と異なったり、必要なデータが欠落したりする原因になります。
例えば、本来すべての社員を一覧表示したい画面でINNER JOINを使用すると、関連する部署情報がない社員が表示されなくなる可能性があります。
逆に、必ず関連データが必要な処理でLEFT JOINを使用すると、不要なNULLデータが含まれ、後続処理が複雑になる場合があります。
まとめ
SQL ServerでINNER JOINとLEFT JOINを使い分ける基本的な考え方は、「結合先にデータが存在しない場合でも元のデータを残したいかどうか」です。
関連するデータがあるものだけ取得する場合はINNER JOIN、左側のテーブルをすべて残したい場合はLEFT JOINを利用します。
実際の開発では、画面表示の目的や集計内容によって適切なJOINを選択することが重要です。テーブル結合後にどのような結果が必要なのかを考えることで、SQL Serverで正確かつ効率的なクエリを作成できるようになります。


コメント