今回は、MySQLにおける「自己結合(Self Join)」について、研修でよく取り上げられるテーマをもとにわかりやすく解説します。


自己結合ってなに?

自己結合とは、同じテーブルを2回使って結合することです。

「え?同じテーブルを2回使うってどういうこと?」と思った方も多いかもしれませんね。

例えるなら、社員名簿を2冊コピーして、それぞれに別の役割(部下と上司)を持たせて見比べるようなイメージです。


今回の例:従業員と上司の関係

以下のような employees テーブルを使います。

idnamemanager_id
1JohnNULL
2Alice1
3Bob1
4Charlie2

このテーブルでは、manager_idがその従業員の上司の id を表しています。


ステップ①:テーブルの作成とデータ挿入

まずはテーブルを作成して、データを入れましょう!

CREATE TABLE employees (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  manager_id INT
);

INSERT INTO employees (id, name, manager_id)
VALUES
  (1, 'John', NULL),
  (2, 'Alice', 1),
  (3, 'Bob', 1),
  (4, 'Charlie', 2);


ステップ②:自己結合を使って上司を取得!

ここでいよいよ自己結合の登場です。

SELECT
  e.name AS employee_name,
  m.name AS manager_name
FROM
  employees e
JOIN
  employees m ON e.manager_id = m.id;


クエリ解説(図解イメージ)

別名意味
e部下側のテーブル
m上司側のテーブル
  • e.manager_id = m.id が「部下の上司IDと上司のIDを一致させる条件」です。

実行結果はこうなります:

employee_namemanager_name
AliceJohn
BobJohn
CharlieAlice

つまり、

  • Alice → Johnが上司
  • Bob → Johnが上司
  • Charlie → Aliceが上司

…という構造が一目でわかりますね!


補足:上司がいない従業員も表示したいときは?

たとえば、Johnのように上司がいない人も表示したい場合は、JOINLEFT JOINに変更します。

SELECT
  e.name AS employee_name,
  m.name AS manager_name
FROM
  employees e
LEFT JOIN
  employees m ON e.manager_id = m.id;

employee_namemanager_name
JohnNULL
AliceJohn
BobJohn
CharlieAlice

自己結合の応用アイデア

自己結合は、上司と部下だけでなく、こんな関係性にも使えます。

  • カテゴリと親カテゴリ(例:商品分類)
  • フォルダと親フォルダ(例:ファイル構造)
  • ユーザーと紹介者(例:紹介制度)

まとめ

ポイント説明
自己結合とは?同じテーブルを別名で2回登場させて結合すること
どんなときに使う?「同じ種類のデータ間の関係性」を表現したいとき
JOIN条件の工夫ON句で適切なカラム同士を結びつける
LEFT JOINも覚えておくと便利!NULLがあっても全部表示したいときに活躍

今後の学習の指針

  • 自己結合で階層構造(再帰的な関係)を扱う方法も調べてみよう
  • WITH句やCTE(共通テーブル式)と組み合わせることで、自己結合をさらに読みやすくできる
  • 自己結合で作成したビューを活用して、他のクエリをシンプルにする方法も検討してみよう

自己結合は、最初はちょっと混乱するかもしれませんが、慣れてくると「同じテーブル内の関係性を可視化する力」になります!

最後までお読みいただきありがとうございます。