MySQL自连接就是在同一张表上自己连接自己,参与连接的表是同一张表,通过设置表别名虚拟出两张表。
当我们想将表中行与同一表中的其他行组合或运算时,可以使用自连接。要执行自连接操作必须使用表别名来帮助MySQL在查询中区分连接后的虚拟结果集中的字段。
示例:
员工信息表中有每位员工的工号、姓名、职位、直属领导工号、入职日期、底薪、提成和所属部门,其中13位员工分别有对应的直属领导,一位领导会有多名下属员工,现在需要查询所有领导者的姓名及其对应的下属员工的姓名。
mysql> select * from emp;
+-------+--------+------------+------+------------+------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+------------+------+------------+------+------+--------+
| 7369 | smith | clerk | 7902 | 1980-12-17 | 800 | NULL | 20 |
| 7499 | allen | salesman | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | ward | salesman | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7566 | jones | manager | 7839 | 1981-04-02 | 2975 | NULL | 20 |
| 7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7698 | blake | manager | 7839 | 1981-05-01 | 2850 | NULL | 30 |
| 7782 | clark | manager | 7839 | 1981-06-09 | 2450 | NULL | 10 |
| 7788 | scott | analyst | 7566 | 1987-04-19 | 3000 | NULL | 20 |
| 7839 | king | persident | NULL | 1981-11-17 | 5000 | NULL | 10 |
| 7844 | turner | salesman | 7698 | 1981-09-08 | 1500 | 0 | 30 |
| 7876 | adams | clerk | 7788 | 1987-05-23 | 1100 | NULL | 20 |
| 7900 | james | clerk | 7698 | 1981-12-03 | 950 | NULL | 30 |
| 7902 | ford | analyst | 7566 | 1981-12-03 | 3000 | NULL | 20 |
| 7934 | miller | clerk | 7782 | 1982-01-23 | 1300 | NULL | 10 |
+-------+--------+------------+------+------------+------+------+--------+
可以通过设置别名的方式模拟两张表分别为t1、t2,t1为领导信息表,t2为员工信息表,将两张表连接起来,连接条件为t1.empno=t2.mgr。
连接后的结果集中查询t1.ename,t2.ename即所有领导者的姓名及其对应的下属员工的姓名。
mysql> select t1.ename 上层管理者,t2.ename 下属员工
-> from emp t1 inner join emp t2 on t1.empno = t2.mgr;
+-----------------+--------------+
| 上层管理者 | 下属员工 |
+-----------------+--------------+
| ford | smith |
| blake | allen |
| blake | ward |
| king | jones |
| blake | martin |
| king | blake |
| king | clark |
| jones | scott |
| blake | turner |
| scott | adams |
| blake | james |
| jones | ford |
| clark | miller |
+-----------------+--------------+