SQLのテーブル結合

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 JOINON 句の使用が推奨されます。

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 JOINLEFT 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;

クロス結合は、特定の組み合わせを生成する際や、テストデータを作成する際などに利用されます。