5種の結合・3テーブルJOIN・USING・非等値結合を完全網羅
正規化によって分割された複数のテーブルを共通列(結合キー)で横に連結し、必要な情報を 1 つの結果セットとして取り出す SQL の核心操作。
| 受注 | 顧客 | JOIN 結果 | ||||||
|---|---|---|---|---|---|---|---|---|
| 受注ID | 顧客ID | 顧客ID | 顧客名 | → | 受注ID | 顧客ID | 顧客名 | |
| 001 | C01 | C01 | 山田 | 001 | C01 | 山田 | ||
| 002 | C02 | C02 | 鈴木 | 002 | C02 | 鈴木 | ||
| 種類 | SQL キーワード | 結果に含まれる行 |
|---|---|---|
| 内部結合 | INNER JOIN(= JOIN) | 両テーブルで結合キーが一致する行のみ |
| 左外部結合 | LEFT OUTER JOIN | 左テーブル全行+右が一致した行(なければ NULL) |
| 右外部結合 | RIGHT OUTER JOIN | 右テーブル全行+左が一致した行(なければ NULL) |
| 完全外部結合 | FULL OUTER JOIN | 両テーブルの全行(不一致側は NULL) |
| 交差結合 | CROSS JOIN | 全組み合わせ(直積 N×M 行) |
SELECT a.列1, b.列2 FROM テーブルA a JOIN テーブルB b ON a.結合キー = b.結合キー WHERE 追加条件;
-- 受注 → 受注明細 → 商品 の 3 テーブル結合 SELECT o.受注ID, d.商品ID, p.商品名, d.数量, p.単価 * d.数量 AS 小計 FROM 受注 o JOIN 受注明細 d ON o.受注ID = d.受注ID JOIN 商品 p ON d.商品ID = p.商品ID WHERE o.受注日 >= '2024-01-01';
-- ON 句で書く場合 SELECT * FROM 受注 o JOIN 顧客 c ON o.顧客ID = c.顧客ID; -- USING で簡潔に(列名が両テーブルで同じ場合) SELECT * FROM 受注 JOIN 顧客 USING (顧客ID);
USING を使うと結合列が結果に 1 列だけ出力される(ON では両テーブル分が別々に出る)。
-- 金額が価格レンジに入る行を結合(非等値結合) SELECT o.受注ID, d.割引率 FROM 受注 o JOIN 割引テーブル d ON o.金額 BETWEEN d.下限 AND d.上限; -- 複合キー結合(複数列が一致する行を結合) SELECT * FROM 在庫 i JOIN 商品マスタ m ON i.倉庫ID = m.倉庫ID AND i.商品ID = m.商品ID;
| テーブル A | テーブル B | CROSS JOIN 結果行数 |
|---|---|---|
| 100 行 | 100 行 | 10,000 行 |
| 1 万行 | 1 万行 | 1 億行(処理不能) |
JOIN のみ = INNER JOIN(同義)LEFT JOIN = LEFT OUTER JOIN(OUTER は省略可)= 以外(BETWEEN・<・>)も使える(非等値結合)読了ボタンを押すとトップページの進捗に反映されます