0Pricing
SQL Academy · 课时

员工与经理

一个经典的层级结构示例

员工与经理 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

什么是自连接

自连接是指将一个表与自身连接。这听起来很不寻常,但当表中的行与同一个表中的其他行存在关系时,它非常有用。

经典示例是一个员工表,其中每位员工都可能有一位经理,而这位经理也是存储在同一个表中的员工。

员工表

我们来创建一个简单的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 会隐藏 Alice,因为她的manager_id为 NULL——右侧没有匹配的行。要包含所有人(包括顶层员工),请使用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 汇报的员工(标识符 = 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;

深入两层

要同时查看两层层级——员工、其经理以及经理的经理——我们可以第三次连接该表。每增加一次连接,就会增加一层层级。

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。

对于大多数实际的员工-经理查询,本课介绍的自连接方法都是合适的工具。

快速检查

请测试您对自连接以及员工-经理层级结构的理解。

课程回顾

在本课中,您学习了如何使用自连接,在单个表中表示和查询经典的员工-经理层级结构。

要点:

  • 自连接使用两个不同的别名将表与自身连接。
  • 连接条件会将同一个表中的manager_id与id关联起来。
  • 使用INNER JOIN只能查看有经理的员工,使用LEFT JOIN则可以包含所有人。
  • COALESCE 可以将 NULL 经理值替换为易读的标签。
  • 对于深度没有上限的层级结构,请考虑使用递归 CTE。

常见问题解答

「员工与经理」课时是免费的吗?

是的 — 「员工与经理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「员工与经理」这节课中我会学到什么?

一个经典的层级结构示例 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「员工与经理」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是自连接
  2. 员工与经理
  3. 比较同一张表中的行
  4. 自连接的局限
← 返回 SQL Academy