SQL Academy · レッスン

従業員とマネージャー

階層構造の典型的な例を学びます。

レッスン 2/413 ステップ

「従業員とマネージャー」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

自己結合とは

自己結合とは、テーブルを自分自身に結合することです。特殊に聞こえますが、テーブル内の行が同じテーブル内の別の行と関係を持つ場合に非常に役立ちます。

典型的な例は、各従業員がマネージャーを持ち、そのマネージャーも同じテーブルに保存されているemployeesテーブルです。

employeesテーブル

簡単なemployeesテーブルを作成しましょう。各従業員はid、name、同じテーブル内の別の行を指すmanager_idを持ちます。

manager_idがNULLの場合、その従業員にはマネージャーがいません。つまり、階層の最上位(CEOなど)に位置します。

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(100) NOT NULL,
  manager_id INT REFERENCES employees(id)
);

サンプルデータの登録

小規模な会社の階層構造を使って、テーブルにデータを登録しましょう。AliceはCEO(マネージャーなし)です。BobとCarolはどちらもAliceの直属の部下で、DaveとEveはBobの直属の部下です。

INSERT INTO employees (id, name, manager_id) VALUES
  (1, 'Alice',   NULL),
  (2, 'Bob',     1),
  (3, 'Carol',   1),
  (4, 'Dave',    2),
  (5, 'Eve',     2),
  (6, 'Frank',   3);

結合を使わずにクエリする

すべての行をそのまま選択すると、マネージャーの名前ではなく、manager_idの数値が表示されます。これは読みにくく、エンドユーザーにとって役立つ情報ではありません。

SELECT id, name, manager_id
FROM employees;

自己結合を記述する

各従業員の隣にマネージャーの名前を表示するには、employeesテーブルを自分自身に結合します。それぞれのコピーに異なるエイリアスを付け、従業員側をe、マネージャー側をmとします。

結合条件で、従業員のmanager_idとマネージャーのidを結び付けます。

SELECT
  e.name   AS employee,
  m.name   AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

マネージャーがいない従業員も含める

上記のINNER JOINでは、manager_idがNULLであるAliceが表示されません。右側に一致する行がないためです。全員(最上位の従業員も含む)を表示するには、LEFT JOINを使います。

Aliceは、マネージャー列がNULLの状態で表示されます。

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

COALESCEで読みやすくする

マネージャー列のNULLは分かりにくいことがあります。COALESCEを使ってNULLを'マネージャーなし'のような読みやすいラベルに置き換えると、レポートの出力をより見やすくできます。

SELECT
  e.name                              AS employee,
  COALESCE(m.name, 'No Manager')      AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY manager, employee;

直属の部下を見つける

クエリの向きを変えて、特定のマネージャーに報告するのは誰かを調べることもできます。これは直属の部下を見つける処理です。ここでは、Alice(id = 1)に直接報告する従業員をすべて見つけます。

SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;

マネージャーごとの部下の人数を数える

自己結合をGROUP BYおよびCOUNTと組み合わせると、各マネージャーに直属の部下が何人いるかを確認できます。これは業務量の分析に役立ちます。

SELECT
  m.name          AS manager,
  COUNT(e.id)     AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;

2レベル下まで表示する

従業員、そのマネージャー、さらにそのマネージャーのマネージャーという2レベル分の階層を一度に表示するには、テーブルを3回目も結合します。結合を1回追加するごとに、階層のレベルが1つ増えます。

SELECT
  e.name   AS employee,
  m.name   AS manager,
  gm.name  AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id  = m.id
LEFT JOIN employees gm ON m.manager_id  = gm.id;

自己結合の限界

自己結合は、固定された浅い階層(1~3レベル)に適しています。会社の組織図が10レベルになる場合のように、深さが不明または無制限の場合は、代わりに再帰CTEが必要です。

実用的な従業員とマネージャーのクエリの多くでは、このレッスンで扱った自己結合が適切な手法です。

理解度チェック

自己結合と従業員・マネージャーの階層構造についての理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、1つのテーブルに保存された、従業員とマネージャーという典型的な階層構造をモデル化し、クエリするための自己結合の使い方を学びました。

重要なポイント:

  • 自己結合では、異なる2つのエイリアスを使ってテーブルを自分自身に結合します。
  • 結合条件で、同じテーブル内のmanager_idとidを結び付けます。
  • マネージャーがいる従業員だけを表示するにはINNER JOINを使い、全員を含めるにはLEFT JOINを使います。
  • COALESCEを使うと、NULLのマネージャー値を読みやすいラベルに置き換えられます。
  • 深さに制限のない階層には、再帰CTEの使用を検討してください。
無料で開始

AI チューターと学ぶ SQL — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
46
レッスン
183

よくある質問

「従業員とマネージャー」レッスンは無料ですか?

はい。「従業員とマネージャー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「従業員とマネージャー」で何を学びますか?

階層構造の典型的な例を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「従業員とマネージャー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 自己結合とは
  2. 従業員とマネージャー
  3. 同じテーブル内の行を比較する
  4. 自己結合の限界
← SQL Academyに戻る