SQL JOINの種類: INNER、LEFT、RIGHT、FULL、CROSS

INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN、CROSS JOINなど、すべてのSQL JOIN型をマスターしましょう。構文、使い分け、NULL処理、パフォーマンスを解説します。

Query

詳細な説明

SQL JOINの種類: INNER、LEFT、RIGHT、FULL、CROSS

JOINは、関連するカラムに基づいて2つ以上のテーブルの行を結合します。各JOIN型を理解することは、正確で効率的なSQLクエリを書くために不可欠です。

INNER JOIN

両方のテーブルで一致する行のみを返します:

SELECT o.order_id, c.name, p.product_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
INNER JOIN products p ON o.product_id = p.id;

どちらかのテーブルに一致がない行は完全に除外されます。単に JOIN と書いた場合のデフォルトはINNER JOINです。

LEFT JOIN (LEFT OUTER JOIN)

左テーブルのすべての行と、右テーブルの一致する行を返します。右テーブルに一致がないカラムはNULLになります:

SELECT c.name, COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.name;

一致しない行の検出: 関連データがないレコードを特定するための強力なパターンです:

SELECT c.customer_name
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_id IS NULL;

RIGHT JOIN (RIGHT OUTER JOIN)

LEFT JOINの逆です。右テーブルのすべての行と、一致する左テーブルの行を返します。RIGHT JOINはテーブルの順序を入れ替えることでLEFT JOINに書き換えられます:

-- 以下は同じ結果を返します:
SELECT e.name, d.dept_name FROM employees e RIGHT JOIN departments d ON e.dept_id = d.id;
SELECT e.name, d.dept_name FROM departments d LEFT JOIN employees e ON d.id = e.dept_id;

FULL OUTER JOIN

両方のテーブルのすべての行を返し、どちらかに一致がない場合はNULLで埋めます。データの照合に不可欠です:

SELECT COALESCE(a.month, b.month) AS month, a.revenue, b.expenses
FROM revenue_report a
FULL OUTER JOIN expense_report b ON a.month = b.month;

MySQLはFULL OUTER JOINを直接サポートしていないため、LEFT JOINとRIGHT JOINの UNION でシミュレートします。

CROSS JOIN

デカルト積(すべての行の組み合わせ)を生成します。ON句は不要です:

SELECT s.size_name, c.color_name
FROM sizes s CROSS JOIN colors c;

警告: 1,000行のテーブル同士のCROSS JOINは1,000,000行を生成します。

パフォーマンスのヒント

  • 効率的な検索のため、JOINカラムには必ずインデックスを作成する
  • INNER JOINは一致しない行を早期に除外できるため、一般的に最も高速
  • LEFT JOINの動作を維持するため、右テーブルのフィルタ条件はON句(WHEREではなく)に記述する
  • EXPLAINを使用してオプティマイザが効率的なJOIN戦略を選択しているか確認する

JOINはリレーショナルデータベースのクエリの要であり、複数テーブルの正規化されたデータを統合された結果セットに組み合わせることを可能にします。

ユースケース

ECサイトのアプリケーションが、orders、customers、productsテーブルを適切なJOIN型で結合し、注文詳細と顧客名、商品情報を一緒に表示する場面。

Try It — SQL Formatter

フルツールを開く