SQL JOINの種類: INNER、LEFT、RIGHT、FULL、CROSS
INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN、CROSS JOINなど、すべてのSQL JOIN型をマスターしましょう。構文、使い分け、NULL処理、パフォーマンスを解説します。
詳細な説明
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型で結合し、注文詳細と顧客名、商品情報を一緒に表示する場面。