
どもども
今回は「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 | 
結合結果
| 学生名 | 科目名 | 
|---|---|
| 山田 | 数学 | 
| 山田 | 英語 | 
| 加藤 | 数学 | 
| 鈴木 | 物理 | 

おつかれさまでした!

  

コメント