SQLの結合(JOIN)は、異なるテーブルのデータを組み合わせるために非常に重要な機能です。
本記事では、結合の種類とそれぞれの使用例について詳しく説明します。
サンプルデータ
使用するサンプルデータは以下のとおりです。
customers テーブル:
customer_id | customer_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
orders テーブル:
order_id | customer_id | order_date |
---|---|---|
1 | 1 | 2024-01-01 |
2 | 2 | 2024-02-15 |
3 | 4 | 2024-03-10 |
内部結合(INNER JOIN)
内部結合は、結合条件に一致する行のみを返します。
これは最も一般的な結合タイプです。
SQLクエリ:
SELECT
orders.order_id,
orders.order_date,
customers.customer_name
FROM
orders
INNER JOIN
customers
ON
orders.customer_id = customers.customer_id;
結果:
order_id | order_date | customer_name |
---|---|---|
1 | 2024-01-01 | Alice |
2 | 2024-02-15 | Bob |
この結果では、orders
テーブルとcustomers
テーブルがcustomer_id
で結合され、一致する行のみが返されます。
左外部結合(LEFT JOIN)
左外部結合は、左側のテーブル(ここではorders
)のすべての行と、右側のテーブル(customers
)の一致する行を返します。
一致しない場合、右側のテーブルの値はNULLになります。
SQLクエリ:
SELECT
orders.order_id,
orders.order_date,
customers.customer_name
FROM
orders
LEFT JOIN
customers
ON
orders.customer_id = customers.customer_id;
結果:
order_id | order_date | customer_name |
---|---|---|
1 | 2024-01-01 | Alice |
2 | 2024-02-15 | Bob |
3 | 2024-03-10 | NULL |
この結果では、orders
テーブルのすべての行が返され、customers
テーブルに一致する行がない場合はNULLが返されます。
右外部結合(RIGHT JOIN)
右外部結合は、右側のテーブル(ここではcustomers
)のすべての行と、左側のテーブル(orders
)の一致する行を返します。
一致しない場合、左側のテーブルの値はNULLになります。
SQLクエリ:
SELECT
orders.order_id,
orders.order_date,
customers.customer_name
FROM
orders
RIGHT JOIN
customers
ON
orders.customer_id = customers.customer_id;
結果:
order_id | order_date | customer_name |
---|---|---|
1 | 2024-01-01 | Alice |
2 | 2024-02-15 | Bob |
NULL | NULL | Charlie |
この結果では、customers
テーブルのすべての行が返され、orders
テーブルに一致する行がない場合はNULLが返されます。
完全外部結合(FULL OUTER JOIN)
完全外部結合は、左側と右側の両方のテーブルのすべての行を返し、一致しない場合はNULLを使用します。
SQLクエリ:
SELECT
orders.order_id,
orders.order_date,
customers.customer_name
FROM
orders
FULL OUTER JOIN
customers
ON
orders.customer_id = customers.customer_id;
結果:
order_id | order_date | customer_name |
---|---|---|
1 | 2024-01-01 | Alice |
2 | 2024-02-15 | Bob |
3 | 2024-03-10 | NULL |
NULL | NULL | Charlie |
この結果では、両方のテーブルのすべての行が返され、いずれかのテーブルに一致する行がない場合はNULLが返されます。
CROSS JOIN
CROSS JOINは、指定された2つのテーブルの全行の直積(デカルト積)を返します。
つまり、1つ目のテーブルの各行に対して2つ目のテーブルの全行を結合します。
SQLクエリ:
SELECT
orders.order_id,
orders.order_date,
customers.customer_name
FROM
orders
CROSS JOIN
customers;
結果:
order_id | order_date | customer_name |
---|---|---|
1 | 2024-01-01 | Alice |
1 | 2024-01-01 | Bob |
1 | 2024-01-01 | Charlie |
2 | 2024-02-15 | Alice |
2 | 2024-02-15 | Bob |
2 | 2024-02-15 | Charlie |
3 | 2024-03-10 | Alice |
3 | 2024-03-10 | Bob |
3 | 2024-03-10 | Charlie |
この結果では、orders
テーブルの各行とcustomers
テーブルの各行がすべて組み合わせられています。
3つの注文(orders)があり、それぞれ3人の顧客(customers)と組み合わされるため、合計で9行の結果が得られます。
結論
結合は、異なるテーブルのデータを組み合わせてクエリを作成するための重要な手法です。それぞれの違いを理解することで、適切なデータを取得し、データベースクエリを適正化できます。