Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説

1

はじめに

「SQLのJOINって難しそう」「実際の使い方がよく分からない」そう感じていませんか?

データベースを扱う上で、テーブル同士を結びつけるJOINは避けては通れない超重要機能です。しかし、用語だけを並べられてもピンとこないのが正直なところですよね。

そこでこの記事では、JOINを「実際の職場の名簿」と「部署一覧表」に例えながら、具体的なイメージを持てるように解説します。記事を読み終わる頃には、inner join、outer join、left join、right joinの違いと使い方がすっきり理解できます!


JOINとは?|実生活で言えば名簿の照らし合わせ

JOINは、複数のテーブルを組み合わせて、欲しい情報を一つにまとめる技です。

例えば、次のような2つの表(テーブル)があるとします:

  • 社員リスト(社員ID・名前・部署ID)

  • 部署リスト(部署ID・部署名)

これってまるで、

  • 「社員の名簿」と、

  • 「部署ごとの一覧表」

が別々に存在しているようなものです。

JOINは、これらを照らし合わせて、

という“現実でよくやる作業”をデータベース上で自動化してくれる機能です。


4種類のJOINを図と例で理解する

1. INNER JOIN(共通するデータだけを取得)

社員と部署の両方に情報が揃っている人だけを表示します。

SELECT 社員.名前, 部署.部署名
FROM 社員
INNER JOIN 部署
ON 社員.部署ID = 部署.部署ID;

例:

「社員名簿」と「部署一覧」を照らし合わせて、部署が登録されている社員だけを表示する感じです。


2. LEFT JOIN(社員全員を表示、部署が無くてもOK)

左側(FROMで指定した)テーブル=社員テーブルのすべての情報を表示します。

SELECT 社員.名前, 部署.部署名
FROM 社員
LEFT JOIN 部署
ON 社員.部署ID = 部署.部署ID;

例:

全社員リストをベースにして、部署が分かっている人は部署名も表示、部署が未登録の人は「部署不明」として表示するイメージです。


3. RIGHT JOIN(部署を基準にする)

右側(JOINした)テーブル=部署テーブルのすべての情報を表示します。

SELECT 社員.名前, 部署.部署名
FROM 社員
RIGHT JOIN 部署
ON 社員.部署ID = 部署.部署ID;

例:

部署一覧表をベースにして、もし社員がいれば名前を表示するけど、誰も所属していない部署でも必ず表示する、という感じです。


4. OUTER JOIN(両方の全情報を出す)

部署に所属していない社員、社員が所属していない部署、両方ともすべて出したいとき。

SELECT 社員.名前, 部署.部署名
FROM 社員
LEFT JOIN 部署
ON 社員.部署ID = 部署.部署ID
UNION
SELECT 社員.名前, 部署.部署名
FROM 社員
RIGHT JOIN 部署
ON 社員.部署ID = 部署.部署ID;

例:

社員名簿と部署一覧表を両方そのまま全部表示し、不明なところは空白で出す、というイメージです。


【発展編】複数テーブルをJOINするパターン

実際の業務では、3つ以上のテーブルを結合するケースもよくあります。

例えば、次のようなテーブル構成だとしましょう:

  • 社員テーブル

  • 部署テーブル

  • 勤務地テーブル

社員は部署に所属し、部署ごとに勤務地も決まっている場合、以下のようにJOINします。

SELECT 社員.名前, 部署.部署名, 勤務地.勤務地名
FROM 社員
INNER JOIN 部署
ON 社員.部署ID = 部署.部署ID
INNER JOIN 勤務地
ON 部署.勤務地ID = 勤務地.勤務地ID;

例:

「社員 → 部署 → 勤務地」と、まるで“情報リレー”のようにJOINをバトンパスしていくイメージです。

このように、JOINは2テーブルに限らず、3テーブル、4テーブルと、必要なだけ繋いでいけます。


JOINの使い分け(迷ったらこれで決めよう)

+------------+--------------------------------------------+
| JOINの種類 | 使うシーン                               |
+------------+--------------------------------------------+
| INNER JOIN | 部署に所属している社員だけ出したい        |
| LEFT JOIN  | 全社員を出して、部署未登録者も拾いたい    |
| RIGHT JOIN | 全部署を出して、空き部署も確認したい      |
| OUTER JOIN | 社員・部署ともにすべて表示したい           |
+------------+--------------------------------------------+

実践:部署別に社員数を集計する

課題:部署ごとの社員数を出したい(部署が未登録でも集計に含めたい)

SELECT 部署.部署名, COUNT(社員.社員ID) AS 社員数
FROM 社員
LEFT JOIN 部署
ON 社員.部署ID = 部署.部署ID
GROUP BY 部署.部署名;

解説

LEFT JOINだから、部署未登録の社員も「未所属」としてまとめて集計できます。

実務では、こうした「抜け漏れ防止」のためにLEFT JOINがよく使われます。


よくある質問

Q1. INNER JOINとLEFT JOINどっちを使えば良い? → 共通データだけならINNER JOIN、抜けも拾いたければLEFT JOIN。

Q2. RIGHT JOINってあまり使わない? → LEFT JOINをテーブルを入れ替えて使えばほぼ代用できます。

Q3. 複数テーブルJOINって難しくない? → バトンリレーのように1つずつJOINしていけば大丈夫です!


まとめ|まずはINNER JOINとLEFT JOINをマスターしよう

JOINは「名簿の照らし合わせ」と思えばイメージしやすいです。

まずはINNER JOINとLEFT JOINの使い分けをマスターするところから始めましょう。

これが分かれば、実際の現場でも自在にデータを組み合わせる力が身につきます。


【外部リンク】

SQL JOIN(Oracle公式)

SQL JOIN(PostgreSQL公式)

【内部リンク】

【SQL】副問い合わせ入門|基本構文から実例まで徹底解説

RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE