
どもども
今回は「SQLの結合条件(JOIN)」について解説します。

結合条件って…種類が多くて混乱しそう…

こんなあなたにピッタリな記事👇
- SQLのjoinの種類がよくわからない
- 結合条件で何を指定すればいいのか迷う
- 1対NやN対Nの意味があいまい
がまぁまぁわかります!
未経験からエンジニア転職を目指すなら
👉 テックゲート転職 をチェック!
結合(JOIN)とは?
SQLにおける「結合(JOIN)」とは、複数のテーブルのデータを共通の値をもとにつなげて、ひとつの表のように扱う操作です。
実務では、「顧客情報」と「注文情報」など、別々に保存されたデータを組み合わせて表示したい場面があります。
そのときに活躍するのが「内部結合」「外部結合」、そして「1対1」「1対N」「N対N」といった関係性です。
内部結合(inner join)とは?
内部結合は、2つのテーブル間で 共通する値がある行だけ を抽出する結合方法です。
SELECT users.id, users.name, orders.amount
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
このSQLは「usersとordersをuser_idでつなぎ、共通するユーザー情報だけを表示」します。
INNER JOIN
は JOIN
と省略して書くことも可能です。
外部結合(outer join)とは?
外部結合は、片方のテーブルにしか存在しないデータも取り出したいときに使います。
外部結合には次の3種類があります。
左外部結合(left outer join)
左側のテーブルにあるすべての行を取得し、右側に一致するデータがない場合は NULL
を表示します。
SELECT users.id, users.name, orders.amount
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;
右外部結合(right outer join)
右側のテーブルにあるすべての行を取得し、左側に一致するデータがない場合は NULL
を表示します。
SELECT users.id, users.name, orders.amount
FROM users
RIGHT OUTER JOIN orders
ON users.id = orders.user_id;
完全外部結合(full outer join)
両方のテーブルの全ての行を取得し、一致しない部分には NULL
が入ります。
SQLiteでは未対応ですが、PostgreSQLやSQL Serverでは使用できます。
SELECT users.id, users.name, orders.amount
FROM users
FULL OUTER JOIN orders
ON users.id = orders.user_id;
1対1の結合条件とは?
1つのデータが1つのデータとだけ対応する関係を指します。
利用場面:1人の顧客が、1つの電話番号だけを持っている場合
状況のイメージ
- 顧客テーブル には顧客の基本情報
- 電話番号テーブル には各顧客の電話番号
SELECT 顧客.顧客ID, 顧客.顧客名, 電話.電話番号
FROM 顧客
INNER JOIN 電話
ON 顧客.顧客ID = 電話.顧客ID;
▶ 顧客テーブル
顧客ID | 顧客名 |
---|---|
1 | 山田 |
2 | 佐藤 |
▶ 電話番号テーブル
電話番号ID | 電話番号 |
---|---|
1 | 090-1234-5678 |
2 | 080-0000-1111 |
結合結果
ID | 名前 | 電話番号 |
---|---|---|
1 | 山田 | 090-1234-5678 |
2 | 佐藤 | 080-0000-1111 |
1対N(複数)の結合条件とは?
1つのデータが、複数のデータと対応する関係を指します。
利用場面:1つの部門に複数の従業員が所属している場合
状況のイメージ
- 部門テーブル には部門情報
- 従業員テーブル には社員情報(外部キーに部門ID)
SELECT 部門.部門ID, 部門.部門名, 従業員.従業員名
FROM 部門
INNER JOIN 従業員
ON 部門.部門ID = 従業員.部門ID;
▶ 部門テーブル
部門ID | 部門名 |
---|---|
1 | 営業部 |
2 | 広報部 |
3 | 開発部 |
▶ 従業員テーブル
従業員ID | 従業員名 | 部門ID |
---|---|---|
1 | 山田 | 1 |
2 | 鈴木 | 1 |
3 | 加藤 | 3 |
結合結果
※ 広報部は従業員がいないため、INNER JOINでは表示されません。
部門ID | 部門名 | 従業員名 |
---|---|---|
1 | 営業部 | 山田 |
1 | 営業部 | 鈴木 |
3 | 開発部 | 加藤 |
N対N(複数)の結合条件とは?
複数のデータが、他の複数のデータと対応する関係を指します。
利用場面:学生が複数の科目を受講していて、1つの科目にも複数の学生がいる場合
状況のイメージ
- 学生テーブル には学生の基本情報
- 科目テーブル には授業科目の情報
- 中間テーブル(学生_科目)でどの学生がどの科目を受講しているかを記録
SELECT 学生.学生名, 科目.科目名
FROM 学生
JOIN 学生_科目 ON 学生.学生ID = 学生_科目.学生ID
JOIN 科目 ON 科目.科目ID = 学生_科目.科目ID;
▶ 学生テーブル
学生ID | 学生名 |
---|---|
1 | 山田 |
2 | 加藤 |
3 | 鈴木 |
▶ 科目テーブル
科目ID | 科目名 |
---|---|
1 | 数学 |
2 | 英語 |
3 | 物理 |
▶ 中間テーブル(学生_科目)
学生ID | 科目ID |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
3 | 3 |
結合結果
学生名 | 科目名 |
---|---|
山田 | 数学 |
山田 | 英語 |
加藤 | 数学 |
鈴木 | 物理 |

おつかれさまでした!
コメント