【SQL入門】JOINの使い分け、完璧に説明できますか?4つの結合を図解で徹底解説
公開日: 2025年11月09日
データベースを扱う上で、避けては通れないのがJOIN(結合)です。 正規化されたデータベースでは、情報は複数のテーブルに分割して保存されています。「ユーザー」テーブルと「注文」テーブルのように。 JOINは、これらのバラバラになったテーブルを、特定のキー(例:user_id)を使って繋ぎ合わせ、一つの大きな表として取得するための、SQLにおける最重要テクニックの一つです。
しかし、このJOINにはいくつかの種類があり、特にINNER JOINとLEFT JOINの違いを曖昧なままにしている初心者は少なくありません。 「なんとなくINNER JOINを使っているけど、たまに思った通りの結果にならない…」 そんな経験はありませんか?
今日は、このJOINの主要な4つの種類を、ベン図を使った分かりやすい図解と共に、その違いと正しい使い分けを徹底的に解説します。 この記事を読み終えれば、あなたはもうJOINで迷うことはありません。
準備:今回の登場人物(テーブル)
解説のために、2つのシンプルなテーブルを用意します。employees(従業員)テーブルと、departments(部署)テーブルです。
`employees`テーブル
| id | name | dept_id |
|---|---|---|
| 1 | 田中 | 1 |
| 2 | 佐藤 | 1 |
| 3 | 鈴木 | 2 |
| 4 | 高橋 | NULL |
`departments`テーブル
| id | name |
|---|---|
| 1 | 営業部 |
| 2 | 開発部 |
| 3 | 人事部 |
ポイントは、従業員の「高橋さん」はどの部署にも所属しておらず(dept_idがNULL)、部署の「人事部」には誰も所属していない、という点です。
1. INNER JOIN (内部結合)
INNER JOINは、両方のテーブルに、結合キーが一致するデータが存在する場合にのみ、その行を返します。最も一般的で、基本となる結合です。
SELECT
e.name AS employee_name,
d.name AS department_name
FROM
employees AS e
INNER JOIN
departments AS d ON e.dept_id = d.id;
実行結果:
| employee_name | department_name |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 営業部 |
| 鈴木 | 開発部 |
部署に所属していない「高橋さん」と、誰も所属していない「人事部」は、結果に含まれないことに注目してください。
2. LEFT JOIN (左外部結合)
LEFT JOIN(またはLEFT OUTER JOIN)は、左側のテーブル(FROM句で最初に指定したテーブル)の行は全て返し、それに一致する右側のテーブルのデータがあれば結合します。一致するデータがなければ、右側のカラムはNULLになります。
SELECT
e.name AS employee_name,
d.name AS department_name
FROM
employees AS e
LEFT JOIN
departments AS d ON e.dept_id = d.id;
実行結果:
| employee_name | department_name |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 営業部 |
| 鈴木 | 開発部 |
| 高橋 | NULL |
左側のテーブルであるemployeesの全従業員が表示され、部署に所属していない「高橋さん」のdepartment_nameがNULLになりました。「従業員の一覧は全員分欲しい。部署名は、あればで良い」という場合に最適です。
3. RIGHT JOIN (右外部結合)
RIGHT JOINは、LEFT JOINの全く逆です。右側のテーブル(JOIN句で指定したテーブル)の行は全て返し、それに一致する左側のテーブルのデータがあれば結合します。
SELECT
e.name AS employee_name,
d.name AS department_name
FROM
employees AS e
RIGHT JOIN
departments AS d ON e.dept_id = d.id;
実行結果:
| employee_name | department_name |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 営業部 |
| 鈴木 | 開発部 |
| NULL | 人事部 |
右側のテーブルであるdepartmentsの全部署が表示され、誰も所属していない「人事部」のemployee_nameがNULLになりました。「部署の一覧は全部欲しい。そこに誰が所属しているかは、分かればで良い」という場合に最適です。
4. FULL OUTER JOIN (完全外部結合)
FULL OUTER JOINは、両方のテーブルの全ての行を返します。LEFT JOINとRIGHT JOINを合わせたような動きで、どちらかのテーブルにしか存在しないデータも、全て結果に含まれます。
-- ※ SQLiteなど、FULL OUTER JOINをサポートしていないDBもあります
SELECT
e.name AS employee_name,
d.name AS department_name
FROM
employees AS e
FULL OUTER JOIN
departments AS d ON e.dept_id = d.id;
実行結果:
| employee_name | department_name |
|---|---|
| 田中 | 営業部 |
| 佐藤 | 営業部 |
| 鈴木 | 開発部 |
| 高橋 | NULL |
| NULL | 人事部 |
従業員にも部署にも、片方しか存在しないデータがすべて含まれました。
🤖 AIに、あなたのJOINを「健康診断」してもらおう
JOIN句は、テーブルが3つ、4つと増えていくと、急激に複雑になります。 「このLEFT JOINは、本当に意図通りの結果を返しているだろうか?」「もっとパフォーマンスの良い結合の仕方はないだろうか?」 そんな不安を感じたら、あなたのSQLクエリをAI SQLチェッカー(AI SQLレビューツール)にかけてみてください。
優れたAIツールは、あなたの書いたJOIN句を分析し、より効率的な書き方や、潜在的なバグ(意図しないNULLの発生など)を指摘してくれます。 これは、あなたのSQLの「健康診断」であり、あなたの書いたクエリが本当に「健康的」かどうかを、客観的な視点で評価してくれるのです。
まとめ
JOINの使い分けは、あなたがどんなデータを「主役」として見たいか、という目的に依存します。
- INNER JOIN: 両方に存在する、関連が確定したデータだけが見たい時。
- LEFT JOIN: 左のテーブルを主役に、全てのデータを表示したい時。
- RIGHT JOIN: 右のテーブルを主役に、全てのデータを表示したい時。
- FULL OUTER JOIN: とにかく全てのデータを、関連があろうがなかろうが見たい時。
実務ではINNER JOINとLEFT JOINが9割以上を占めます。まずはこの2つの違いを、ベン図と共に完璧にマスターすることが、あなたがSQL中級者へとステップアップするための、最も重要な鍵となります。
プログラミング学習に必須ツール!
記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。
AIコード解説ツールを使ってみる →