データ結合の壁を超えよう!INNER JOINとOUTER JOINを使い分けるためのヒント
SQLにおけるINNER JOINとOUTER JOINの違い
INNER JOIN と OUTER JOIN は、JOINの種類の中でも特に重要なものです。
INNER JOIN と OUTER JOIN の主な違いは、結合する行の条件です。
INNER JOIN は、結合するテーブル同士で共通する行のみを抽出します。 一方、OUTER JOIN は、共通する行だけでなく、共通しない行も含めて抽出することができます。
図:INNER JOINとOUTER JOINの比較
種類 | 結合条件 | 抽出される行 |
---|---|---|
INNER JOIN | 両方のテーブルで共通する行 | 共通する行のみ |
OUTER JOIN | 一方のテーブルまたは両方のテーブルで共通する行 | 共通する行と、共通しない行 |
INNER JOIN は、関連するテーブルから共通するデータを取得する際に使用します。 例えば、顧客情報と注文情報を結合して、顧客の注文履歴を取得するような場合に INNER JOIN を使用します。
OUTER JOIN には、以下の種類があります。
- LEFT OUTER JOIN:左側のテーブルのすべての行と、右側のテーブルで一致する行を抽出します。
- FULL OUTER JOIN:両方のテーブルのすべての行を抽出します。
以下の例では、customers
テーブルと orders
テーブルを結合します。
-- 顧客情報と注文情報を結合する
-- INNER JOIN
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
-- LEFT OUTER JOIN
SELECT *
FROM customers
LEFT OUTER JOIN orders
ON customers.id = orders.customer_id;
-- RIGHT OUTER JOIN
SELECT *
FROM customers
RIGHT OUTER JOIN orders
ON customers.id = orders.customer_id;
-- FULL OUTER JOIN
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.id = orders.customer_id;
INNER JOIN の場合は、customers
テーブルと orders
テーブルで共通するIDを持つ行のみが抽出されます。
一方、LEFT OUTER JOIN の場合は、customers
テーブルのすべての行が抽出され、orders
テーブルで一致する行があればその情報も表示されます。
FULL OUTER JOIN の場合は、customers
テーブルと orders
テーブルのすべての行が抽出され、一致する行と一致しない行がすべて表示されます。
それぞれの違いを理解して、目的に合った結合方法を選択することが重要です。
-- テーブル定義
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
product VARCHAR(255)
);
-- データ挿入
INSERT INTO customers (id, name) VALUES (1, 'John Doe');
INSERT INTO customers (id, name) VALUES (2, 'Jane Doe');
INSERT INTO orders (id, customer_id, product) VALUES (1, 1, 'Product A');
INSERT INTO orders (id, customer_id, product) VALUES (2, 2, 'Product B');
-- INNER JOIN
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
-- 結果
| id | name | id | customer_id | product |
|---|---|---|---|---|
| 1 | John Doe | 1 | 1 | Product A |
| 2 | Jane Doe | 2 | 2 | Product B |
-- LEFT OUTER JOIN
SELECT *
FROM customers
LEFT OUTER JOIN orders
ON customers.id = orders.customer_id;
-- 結果
| id | name | id | customer_id | product |
|---|---|---|---|---|
| 1 | John Doe | 1 | 1 | Product A |
| 2 | Jane Doe | NULL | NULL | NULL |
-- RIGHT OUTER JOIN
SELECT *
FROM customers
RIGHT OUTER JOIN orders
ON customers.id = orders.customer_id;
-- 結果
| id | name | id | customer_id | product |
|---|---|---|---|---|
| 1 | John Doe | 1 | 1 | Product A |
| 2 | Jane Doe | 2 | 2 | Product B |
-- FULL OUTER JOIN
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.id = orders.customer_id;
-- 結果
| id | name | id | customer_id | product |
|---|---|---|---|---|
| 1 | John Doe | 1 | 1 | Product A |
| 2 | Jane Doe | 2 | 2 | Product B |
| NULL | NULL | 3 | NULL | NULL |
図を用いる
INNER JOINとOUTER JOINの比較図: https://www.w3schools.com/sql/sql_join_inner.asp
表を用いる
種類 | 結合条件 | 抽出される行 |
---|---|---|
INNER JOIN | 両方のテーブルで共通する行 | 共通する行のみ |
OUTER JOIN | 一方のテーブルまたは両方のテーブルで共通する行 | 共通する行と、共通しない行 |
例を用いる
例えば、顧客情報と注文情報を結合するような場合、以下のようになります。
INNER JOIN
SELECT *
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
このクエリは、顧客情報と注文情報で共通するIDを持つ行のみを抽出します。
SELECT *
FROM customers
LEFT OUTER JOIN orders
ON customers.id = orders.customer_id;
このクエリは、顧客情報のすべての行を抽出します。注文情報で一致する行があれば、その情報も表示されます。
類似概念を用いる
INNER JOINとOUTER JOINは、数学の集合論における「共通部分」と「和集合」に似た概念です。
- INNER JOINは、共通部分に相当します。
メタファーを用いる
例えば、INNER JOINは「共通の趣味を持つ人同士の集まり」に例えることができます。
一方、OUTER JOINは「ある条件に合致する人全員のリスト」に例えることができます。
対話形式で説明する
例えば、以下のような対話形式で説明することができます。
回答者: INNER JOINは、関連するテーブルから共通するデータを取得する際に使用します。OUTER JOINは、関連するテーブルから共通するデータだけでなく、共通しないデータも含めて取得する際に使用します。
このように、対話形式で説明することで、学習者が理解しやすいように説明することができます。
それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分けることが重要です。
sql join inner-join