SELF JOIN
自连接是同一张表和自身做 JOIN,用不同的别名区分"左角色"和"右角色"。它能把同一张表里的行之间建立关联。
典型场景很多:员工表里找"和某人同部门的人"、组织结构里找"某人的上级"、商品表里找"同一店铺的其他商品"。这些关系都藏在同一张表里,用一个 JOIN 把表自己连起来就能挖掘出来。
自连接没有专门的语法关键字——就是普通的 INNER JOIN / LEFT JOIN,只是连接的两方是同一张表。关键是用别名区分角色。
以飞翔科技为例:
-- 找与"航仔"同部门的其他员工
SELECT e1.emp_name AS 同事, e1.basic_salary
FROM employees e1
INNER JOIN employees e2 ON e1.dept_code = e2.dept_code
WHERE e2.emp_name = '航仔' AND e1.emp_name != '航仔';
-- 找比"图妹"工资高的同事
SELECT e1.emp_name, e1.basic_salary
FROM employees e1
INNER JOIN employees e2 ON e1.basic_salary > e2.basic_salary
WHERE e2.emp_name = '图妹';
-- 同一部门工资高于"云吞"的同事
SELECT e1.emp_name, e1.basic_salary, e1.dept_code
FROM employees e1
INNER JOIN employees e2
ON e1.dept_code = e2.dept_code
AND e1.basic_salary > e2.basic_salary
WHERE e2.emp_name = '云吞';
第一个例子里,e1 是"同事",e2 是"航仔"——同表两个别名,扮演两个不同角色。ON e1.dept_code = e2.dept_code 表示"同事和航仔同部门",AND e1.emp_name != '航仔' 排除自己和自己比。