员工与经理
一个经典的层级结构示例
员工与经理 是 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 反馈 — 无需本地设置。