SQLにおけるテーブル結合 (JOIN) は、複数のテーブルから関連するデータを組み合わせて取得するための機能です。リレーショナルデータベースの設計では、データの冗長性を排除するためにテーブルを分割(正規化)するため、結合は非常に重要な操作となります。
1. 内部結合 (INNER JOIN)
内部結合は、結合条件を満たす両方のテーブルの行のみを結果として返します。最も一般的に使用される結合タイプです。
SELECT 列リスト
FROM テーブル1
INNER JOIN テーブル2
ON 結合条件;
テーブル1
,テーブル2
: 結合するテーブルの名前。結合条件
: 結合の基準となる条件を指定します。通常は、両方のテーブルに共通する列(主キーと外部キーの関係など)を=
で比較します。
例:
orders
テーブルと customers
テーブルを customer_id
で結合し、注文情報と顧客名を取得します。
SELECT
o.order_id,
o.order_date,
c.customer_name
FROM
orders AS o
INNER JOIN
customers AS c
ON
o.customer_id = c.customer_id;
NATURAL JOIN
(自然結合)
NATURAL JOIN
を使用すると、両方のテーブルで同じ名前の列を自動的に結合キーとして使用します。この場合、ON
句で結合条件を明示的に指定する必要はありません。
SELECT 列リスト
FROM テーブル1
NATURAL JOIN テーブル2;
注意: 列名が一致するすべての列が結合条件として使用されるため、意図しない結合が行われる可能性があります。明示的な INNER JOIN
と ON
句の使用が推奨されます。
2. 外部結合 (OUTER JOIN)
外部結合は、結合条件を満たす行に加えて、条件を満たさない側のテーブルの行も結果に含めます。条件を満たさない行の、結合相手のテーブルの列には NULL
が入ります。
左外部結合 (LEFT OUTER JOIN / LEFT JOIN)
FROM
句で指定した左側のテーブルのすべての行と、結合条件を満たす右側のテーブルの行を返します。右側のテーブルに一致する行がない場合は、右側の列に NULL
が入ります。
SELECT 列リスト
FROM テーブル1
LEFT OUTER JOIN テーブル2
ON 結合条件;
-- または (OUTERは省略可能)
SELECT 列リスト
FROM テーブル1
LEFT JOIN テーブル2
ON 結合条件;
例: すべての顧客と、その顧客が行った注文情報を取得します。注文がない顧客も表示されます。
SELECT
c.customer_name,
o.order_id,
o.order_date
FROM
customers AS c
LEFT JOIN
orders AS o
ON
c.customer_id = o.customer_id;
右外部結合 (RIGHT OUTER JOIN / RIGHT JOIN)
FROM
句で指定した右側のテーブルのすべての行と、結合条件を満たす左側のテーブルの行を返します。左側のテーブルに一致する行がない場合は、左側の列に NULL
が入ります。
SELECT 列リスト
FROM テーブル1
RIGHT OUTER JOIN テーブル2
ON 結合条件;
-- または (OUTERは省略可能)
SELECT 列リスト
FROM テーブル1
RIGHT JOIN テーブル2
ON 結合条件;
例: すべての注文情報と、その注文を行った顧客名を取得します。顧客情報がない注文(通常はありえないが、データ不整合の場合など)も表示されます。
SELECT
c.customer_name,
o.order_id,
o.order_date
FROM
customers AS c
RIGHT JOIN
orders AS o
ON
c.customer_id = o.customer_id;
補足: RIGHT JOIN
は LEFT JOIN
とテーブルの順序を入れ替えることで同じ結果を得られるため、一般的には LEFT JOIN
がより頻繁に使用されます。
3. クロス結合 (CROSS JOIN)
クロス結合は、結合条件を指定せず、両方のテーブルのすべての行の組み合わせ(デカルト積)を返します。結果セットの行数は、「テーブル1の行数 × テーブル2の行数」となります。
SELECT 列リスト
FROM テーブル1
CROSS JOIN テーブル2;
例:
colors
テーブルと sizes
テーブルをクロス結合し、すべての色とサイズの組み合わせを生成します。
SELECT
c.color_name,
s.size_name
FROM
colors AS c
CROSS JOIN
sizes AS s;
クロス結合は、特定の組み合わせを生成する際や、テストデータを作成する際などに利用されます。