SQLのJOINは、複数テーブルからデータを結合して取得するための基本機能です。INNER・LEFT・RIGHT・FULL・CROSSなどの種類があり、正しく使い分けるとデータ取得が大幅に簡潔になります。本記事では、JOINの種類を図解的に整理します。
テストテーブル
users orders
+----+----+ +----+--------+
| id |name| | id |user_id |
+----+----+ +----+--------+
| 1 | A | | 10 | 1 |
| 2 | B | | 11 | 1 |
| 3 | C | | 12 | 2 |
| 13 | 99 |
INNER JOIN
両テーブルで一致した行だけ取得。
SELECT u.name, o.id
FROM users u
INNER JOIN orders o ON o.user_id = u.id;
-- 結果: (A,10), (A,11), (B,12)
-- ※ C や user_id=99 は除外
LEFT JOIN
左テーブルは全件、右に一致がなければNULL。
SELECT u.name, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
-- 結果: (A,10), (A,11), (B,12), (C, NULL)
RIGHT JOIN
LEFT JOINの左右が逆。右テーブルが全件。
FULL OUTER JOIN
両方の全件を結合し、不一致部分はNULL。
SELECT u.name, o.id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;
-- 結果: A・B・Cと、user_id=99のorderすべて
CROSS JOIN
すべての組み合わせ(直積)。テストデータ生成等で使う。
SELECT u.name, o.id
FROM users u
CROSS JOIN orders o;
-- 行数 = users行数 × orders行数
SELF JOIN
同一テーブルを自分自身と結合。社員→上司のような階層データに使う。
SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
JOIN条件の書き方
- ON句:結合条件を明示(推奨)
- USING句:両テーブルの同名カラムで結合
- NATURAL JOIN:同名カラムを自動的に結合(非推奨)
パフォーマンスのコツ
- JOINキーには必ずインデックス
- WHERE で先に絞ってから JOIN
- EXPLAINで実行計画を確認
- 過剰なJOINは正規化見直しの合図
まとめ
JOINは「INNER(一致のみ)」「LEFT(左基準)」「FULL(両方)」「CROSS(直積)」の4種を押さえれば、ほとんどの実務ケースで困らなくなります。図と共に手を動かして練習するのが理解の近道です。