1.はじめに
データベースを扱う上で避けて通れないのが「JOIN(結合)」です。この記事では、SQLのJOINの基本から、特によく使われるINNER JOINとLEFT JOINに焦点を当てて、その特徴と使い分けを解説します。
2. JOINとは
データベースにおけるJOINとは、異なる複数のテーブルに格納されたデータを、共通するカラム(列) を基準として一つにまとめ、関連付ける操作のことです。
データベースは通常、データを効率的に管理するために、関連する情報を複数のテーブルに分割します。例えば、顧客情報と注文情報を考えてみます。顧客の名前や住所は「顧客テーブル」に、いつ誰が何を注文したかは「注文テーブル」に保存されるのが一般的です。
しかし、「どの顧客が、どんな商品を、いつ購入したのか」といった情報をまとめて見たい場合、これら別々のテーブルを「顧客ID」のような共通の情報を手掛かりに結合する必要があります。JOINを使うことで、結合したいテーブル同士が持つ共通のキーを指定し、そのキーの値が一致する行を連結して新しい一つの結果セットを作成できます。
3. JOINの種類と特徴
SQLにはいくつかのJOINの種類がありますが、ここでは特によく利用されるINNER JOINとLEFT JOINについて見ていきます。
3-1. INNER JOIN(内部結合)とは
INNER JOIN(内部結合) は、結合する両方のテーブルに共通するデータだけを結果として取得します。
これは、結合条件(ON
句で指定する共通カラム)が両方のテーブルで完全に一致する行のみが結合されます。どちらか一方のテーブルにしか存在しないデータは、結合後の結果セットには含まれません。
INNER JOINは、完全に一致するデータだけが必要なときに利用します。例えば、「注文履歴のある顧客だけを知りたい」場合などに適しています。
3-2. LEFT JOIN(左外部結合)とは
LEFT JOIN(左外部結合) は、結合するテーブルのうち、左側のテーブルのデータをすべて残しつつ、右側のテーブルで結合条件に合うデータをくっつけます。
もし右側のテーブルに一致するデータがなかった場合でも、左側のテーブルの行は結果セットに残ります。その際、右側のテーブルから取得されるはずだったカラムには NULL
が入ります。
LEFT JOINは、左のデータを基準にして漏れなく取得したいときに利用します。例えば、「すべての顧客の情報を見つつ、もし注文履歴があればその情報も表示したい」場合などに有効です。
4. 実行例
実際にサンプルテーブルを使って、INNER JOINとLEFT JOINの違いを見ていきます。
サンプルテーブル紹介
customers
テーブル(顧客情報)
customer_id | customer_name |
---|---|
1 | 山田太郎 |
2 | 佐藤花子 |
3 | 鈴木一郎 |
4 | 田中優子 |
orders
テーブル(注文情報)
order_id | customer_id | order_date | amount |
---|---|---|---|
101 | 1 | 2023-01-10 | 5000 |
102 | 2 | 2023-01-15 | 8000 |
103 | 1 | 2023-01-20 | 3000 |
104 | 5 | 2023-01-25 | 10000 |
実際のSQL文
INNER JOIN
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.order_date,
o.amount
FROM
customers AS c
INNER JOIN
orders AS o ON c.customer_id = o.customer_id;
LEFT JOIN
SELECT
c.customer_id,
c.customer_name,
o.order_id,
o.order_date,
o.amount
FROM
customers AS c
LEFT JOIN
orders AS o ON c.customer_id = o.customer_id;
実行結果を表で比較
INNER JOIN
customer_id | customer_name | order_id | order_date | amount |
---|---|---|---|---|
1 | 山田太郎 | 101 | 2023-01-10 | 5000 |
2 | 佐藤花子 | 102 | 2023-01-15 | 8000 |
1 | 山田太郎 | 103 | 2023-01-20 | 3000 |
LEFT JOIN
customer_id | customer_name | order_id | order_date | amount |
---|---|---|---|---|
1 | 山田太郎 | 101 | 2023-01-10 | 5000 |
2 | 佐藤花子 | 102 | 2023-01-15 | 8000 |
3 | 鈴木一郎 | NULL | NULL | NULL |
4 | 田中優子 | NULL | NULL | NULL |
1 | 山田太郎 | 103 | 2023-01-20 | 3000 |
5. まとめ
- INNER JOINは、結合条件が両方のテーブルで完全に一致するデータだけが欲しいときに使います。
- LEFT JOINは、左側の基準となるテーブルのデータをすべて残しつつ、右側の関連するデータも取得したいときに使います。
結合条件と、どちらのテーブルのデータを基準にするかを理解することで適切にテーブルをJOINできるようになります。ぜひご自身のデータでも様々なJOINを試してみてください。