3秒でわかる
複数のテーブルを共通の列で結び付け、1つの結果表にするSQLの操作。重複を避けて分けて保存したデータを、表示のたびに組み立て直します。
30秒図解
もう少し詳しく
どういうものか
JOIN は、別々のテーブルに入っているデータを共通の列でつなぎ、1 つの結果表として取り出す SQL の操作です。注文テーブルには顧客IDしか入っていなくても、顧客テーブルと ID で結べば、注文一覧に氏名を並べて表示できます。つなぎ方には内部結合と外部結合があり、片方にしか無い行をどう扱うかで使い分けます。
なぜ必要か
データベースでは、同じ情報を 1 か所にだけ持たせる設計をします。注文のたびに顧客名をコピーして保存すると、改姓のときに全件を直す必要が生じ、直し漏れた行だけ古い名前が残ります。だから分けて持ちます。ただし人が見る画面では、分けたままでは意味が読み取れません。保存は分けて、表示のときに組み立て直す。その組み立てを担うのが JOIN です。
具体例
SELECT o.id, o.ordered_at, c.name, o.amount
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.id
WHERE o.ordered_at >= '2026-08-01'
ORDER BY o.ordered_at DESC;
-- 注文が1件も無い顧客も出したい場合
SELECT c.name, COUNT(o.id) AS order_count
FROM customers AS c
LEFT JOIN orders AS o ON c.id = o.customer_id
GROUP BY c.name;つまずきやすいところ
件数が想定より増える現象が最初の関門です。結合先に同じキーの行が 3 件あれば、元の 1 行は 3 行に膨らみます。この状態で合計を出すと金額が 3 倍になり、しかもエラーは出ません。合計が合わないときは、まず結合前後の行数を数えて比べます。もうひとつは LEFT JOIN の相手側に WHERE の条件を書く誤りで、WHERE o.status = 'done' と書いた瞬間、NULL の行が落ちて内部結合と同じ結果になります。この条件は ON 句に書きます。
似た用語との違い
| 種類 | 残る行 |
|---|---|
| INNER JOIN | 両方に一致がある行だけ |
| LEFT JOIN | 左の全行と、一致した右の値 |
| RIGHT JOIN | 右の全行と、一致した左の値 |
| CROSS JOIN | 全組み合わせ |
覚え方
JOIN は表をつなぐのではなく、行と行をつなぐ操作です。左の 1 行に対して右が何行当たるのかを先に考えておくと、件数が膨らむ事故も、行が消える事故も避けられます。1 対 1 なら安全、1 対多なら合計に注意が要ります。