LESSON 30分

INNER JOINでテーブルを結合しよう

ストーリー

「さて、いよいよJOINだ。本番DBの調査で一番使う技術だぞ」

「社員一覧に部署名も表示したいって依頼が来たんですが、どうすれば...」

「employees テーブルには department_id しかないからね。departments テーブルと結合して、部署名を取ってくる必要がある」

「それが JOIN ですか!」

「そう。まずは一番基本の INNER JOIN から覚えよう」


JOINとは

JOINは、2つ以上のテーブルを共通のカラムで結合して、1つの結果セットにする操作です。

JOINがない場合

sql
-- 社員一覧
SELECT id, name, department_id FROM employees;
idnamedepartment_id
1田中太郎1
2佐藤花子1
3鈴木一郎1

department_id が「1」... これは何部?

JOINを使った場合

sql
SELECT employees.name, departments.name AS department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
namedepartment_name
田中太郎開発部
佐藤花子開発部
鈴木一郎開発部

部署名がわかるようになりました。


INNER JOINの構文

sql
SELECT カラム名
FROM テーブルA
INNER JOIN テーブルB ON テーブルA.カラム = テーブルB.カラム;

重要なポイント

  • ON の後に結合条件を指定する
  • 結合条件は通常「外部キー = 主キー」
  • INNER JOIN は両方のテーブルに一致するデータのみ返す

テーブルのエイリアス(別名)

テーブル名が長いと書くのが大変なので、エイリアス(別名)を使います。

sql
-- エイリアスなし(長い)
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

-- エイリアスあり(短い)
SELECT e.name, d.name AS department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

employees e と書くと、以降 e でテーブルを参照できます。


実践例

例1: 社員と部署の結合

sql
SELECT
    e.id,
    e.name AS 社員名,
    d.name AS 部署名,
    e.position AS 役職,
    e.salary AS 月給
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

結果:

id社員名部署名役職月給
1田中太郎開発部マネージャー500000
2佐藤花子開発部シニアエンジニア450000
3鈴木一郎開発部エンジニア380000
4高橋美咲営業部マネージャー480000
...............

例2: 部署ごとの社員数

sql
SELECT
    d.name AS 部署名,
    COUNT(e.id) AS 社員数,
    AVG(e.salary) AS 平均給与
FROM departments d
INNER JOIN employees e ON d.id = e.department_id
GROUP BY d.name;

結果:

部署名社員数平均給与
開発部3443333
営業部3386666
人事部2400000
マーケティング部2415000

例3: プロジェクトと担当部署

sql
SELECT
    p.name AS プロジェクト名,
    d.name AS 担当部署,
    p.budget AS 予算,
    p.status AS 状態
FROM projects p
INNER JOIN departments d ON p.department_id = d.id;

結果:

プロジェクト名担当部署予算状態
ECサイトリニューアル開発部3000000active
社内ツール開発開発部1000000active
営業支援システム営業部2000000completed
ブランディング施策マーケティング部1500000active

INNER JOINの動作原理

INNER JOINは、結合条件に一致する行の組み合わせだけを返します。

employees テーブル          departments テーブル
+----+----------+-------+   +----+--------+
| id | name     | dep_id|   | id | name   |
+----+----------+-------+   +----+--------+
| 1  | 田中太郎 | 1     |   | 1  | 開発部 |
| 2  | 佐藤花子 | 1     |   | 2  | 営業部 |
| 3  | 鈴木一郎 | 1     |   | 3  | 人事部 |
+----+----------+-------+   +----+--------+

INNER JOIN ON e.department_id = d.id

結果:
+----------+--------+
| name     | dept   |
+----------+--------+
| 田中太郎 | 開発部 |  ← dep_id=1 と id=1 が一致
| 佐藤花子 | 開発部 |  ← dep_id=1 と id=1 が一致
| 鈴木一郎 | 開発部 |  ← dep_id=1 と id=1 が一致
+----------+--------+

一致しない行は結果に含まれません。 これがINNER JOINの特徴です。


WHERE句との組み合わせ

JOINした結果に対して、さらにWHEREでフィルタリングできます。

sql
-- 開発部の社員だけを取得
SELECT e.name, d.name AS department_name, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
WHERE d.name = '開発部';

-- 給与40万以上の社員と所属部署
SELECT e.name, d.name AS department_name, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
WHERE e.salary >= 400000
ORDER BY e.salary DESC;

まとめ

ポイント内容
INNER JOIN2つのテーブルを共通カラムで結合する
ON句結合条件を指定する(通常は外部キー = 主キー)
エイリアステーブルに短い別名をつけて読みやすくする
動作両方のテーブルに一致するデータのみ返す
WHEREJOINの結果をさらにフィルタリングできる

チェックリスト

  • INNER JOINの構文を書ける
  • テーブルのエイリアスを使える
  • ON句で結合条件を指定できる
  • JOINの結果にWHEREを組み合わせられる

次のステップへ

INNER JOINを覚えました。 しかし、INNER JOINでは「一致しないデータ」が消えてしまいます。 次のセクションでは、一致しないデータも保持する LEFT JOIN を学びます。


推定読了時間: 30分