SQLのjoinとは?内部結合・外部結合・1対N・N対Nの違いを解説!

SQLのjoinとは?内部結合・外部結合・1対N・N対Nの違いを解説! SQL
SQLのjoinとは?内部結合・外部結合・1対N・N対Nの違いを解説!
この記事は約5分で読めます。
てんハロ運営者
てんハロ運営者

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

バグヲ
バグヲ

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

てんハロ運営者
てんハロ運営者

こんなあなたにピッタリな記事👇

  • SQLのjoinの種類がよくわからない
  • 結合条件で何を指定すればいいのか迷う
  • 1対NやN対Nの意味があいまい

がまぁまぁわかります!

未経験からエンジニア転職を目指すなら
👉 テックゲート転職 をチェック!

【意外と知らないIT用語】ドメインって何? お名前.com

結合(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 JOINJOIN と省略して書くことも可能です。

外部結合(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電話番号
1090-1234-5678
2080-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加藤

結合結果

※ 広報部は従業員がいないため、INNER JOINでは表示されません。

部門ID部門名従業員名
1営業部山田
営業部鈴木
開発部加藤

N対N(複数)の結合条件とは?

複数のデータが、他の複数のデータと対応する関係を指します。

利用場面:学生が複数の科目を受講していて、1つの科目にも複数の学生がいる場合

状況のイメージ

  • 学生テーブル には学生の基本情報
  • 科目テーブル には授業科目の情報
  • 中間テーブル(学生_科目)でどの学生がどの科目を受講しているかを記録
SELECT 学生.学生名, 科目.科目名
FROM 学生
JOIN 学生_科目 ON 学生.学生ID = 学生_科目.学生ID
JOIN 科目 ON 科目.科目ID = 学生_科目.科目ID;

▶ 学生テーブル

学生ID学生名
1山田
2加藤
3鈴木

▶ 科目テーブル

科目ID科目名
1数学
2英語
3物理

▶ 中間テーブル(学生_科目)

学生ID科目ID
11
12
21
33

結合結果

学生名科目名
山田数学
山田英語
加藤数学
鈴木物理
てんハロ運営者
てんハロ運営者

おつかれさまでした!

更新をF5連打で待つの、そろそろやめませんか?
( ブログ更新をメールでそっとお知らせします🙇‍♂️ )

スパムはしません!詳細については、プライバシーポリシーをご覧ください。

コメント