従業員とマネージャー
階層構造の典型的な例を学びます。
「従業員とマネージャー」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 自己結合とは
- 従業員とマネージャー
- 同じテーブル内の行を比較する
- 自己結合の限界