INNER JOINとLEFT JOIN/RIGHT JOINの違いを理解して使い分ける
SQLにおけるJOINとINNER JOINの違い
JOIN とは
JOIN は、複数のテーブルのレコードを関連付け、1つの結果セットに結合する操作です。テーブル同士を結合するには、共通する列(結合キー)が必要です。JOINには、INNER JOIN以外にも様々な種類があります。
INNER JOIN とは
INNER JOIN は、両方のテーブルで結合条件が一致するレコードのみ を返す結合方法です。つまり、一方のテーブルにのみ存在するレコードは結果セットに含まれません。
JOINとINNER JOINの比較
項目 | JOIN | INNER JOIN |
---|---|---|
結果セット | 結合条件を満たすレコード と 一方のテーブルにのみ存在するレコード | 結合条件を満たすレコードのみ |
使用例 | すべての関連データを抽出したい場合 | 重複なく関連データを抽出したい場合 |
種類 | INNER JOIN 以外にも LEFT JOIN、RIGHT JOIN、FULL JOIN など | INNER JOIN は JOIN の省略形として使用可能 |
例
テーブル構成
-
社員テーブル (employees)
-
部署テーブル (departments)
JOIN
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id;
結果
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
3 | 田中一郎 | 1 | 営業部
INNER JOIN
SELECT *
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
上記の例では、JOIN と INNER JOIN は同じ結果セットを返します。これは、employees テーブルと departments テーブルのすべてのレコードに共通する department_id が存在するためです。
一方のテーブルにのみ存在するレコード を含めたい場合は、INNER JOIN ではなく JOIN を使用する必要があります。
- JOIN は、複数のテーブルからデータを結合する操作
- INNER JOIN は、両方のテーブルで結合条件が一致するレコードのみを返す結合方法
- 一方のテーブルにのみ存在するレコードも含めたい場合は、JOINを使用する
補足
- INNER JOIN は JOIN の省略形として使用できます。
- JOIN には、LEFT JOIN、RIGHT JOIN、FULL JOIN など様々な種類があります。
JOIN
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
3 | 田中一郎 | 1 | 営業部
INNER JOIN
SELECT *
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
LEFT JOIN
SELECT *
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
3 | 田中一郎 | NULL | NULL
RIGHT JOIN
SELECT *
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
FULL JOIN
SELECT *
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
3 | 田中一郎 | NULL | NULL
INNER JOIN 以外の方法
サブクエリ
SELECT *
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
);
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
UNION
SELECT *
FROM employees
UNION
SELECT *
FROM departments;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
2 | 佐藤花子 | 2 | 経理部
1 | 営業部 | NULL | NULL
2 | 経理部 | NULL | NULL
CROSS JOIN
SELECT *
FROM employees
CROSS JOIN departments;
id | name | department_id | name
------- | -------- | -------- | --------
1 | 山田太郎 | 1 | 営業部
1 | 山田太郎 | 1 | 経理部
2 | 佐藤花子 | 2 | 営業部
2 | 佐藤花子 | 2 | 経理部
3 | 田中一郎 | 1 | 営業部
3 | 田中一郎 | 1 | 経理部
その他
上記以外にも、CASE 式やピボットテーブルなど、状況に応じて様々な方法があります。
- INNER JOIN は、最も基本的な結合方法であり、重複なく関連データを抽出したい場合に使用します。
- サブクエリ は、複雑な結合条件を指定したい場合に使用します。
- UNION は、異なるテーブル構造のデータを結合したい場合に使用します。
- CROSS JOIN は、すべてのレコードを組み合わせたい場合に使用します。
INNER JOIN 以外にも、複数のテーブルからデータを結合する方法があります。どの方法を使うべきかは、目的や状況によって異なります。
sql sql-server join