27.自连接
自连接是指在同一张表的连接查询【将同一张表看作两张表】。
1.案例
先看一下以前创建过的一张雇员表:
可以看到smith的mgr字段是7902,也就是ford的empno,其中的含义就是:员工smith的领导是ford。
现在我们有这样一个需求:显示员工名字和其领导的名字。
但是,员工名字和其领导的员工号都在一张表里面,该如何显示二者呢?
于是自连接的概念就诞生了:一张表当作两张表查。
SELECT * from emp,emp;
显然这样直接查会直接报错,其提示我们用别名(alias)。
SELECT * from emp worker,emp boss;
像这种直接写在要查的表名之后的就是别名了。
但是,这时依然会有问题。
我们得到了196条记录,也就是14*14=196条,毋庸置疑,通过别名的方式把一个表当两张表来查,出现了笛卡尔集。
为了解决此问题,我们需要进行过滤。
明确一下过滤的条件:只有worker的mgr和boss的empno相等时才是有意义的记录。
SELECT worker.ename as '员工名子',boss.ename as '领导名字'from emp worker,emp bossWHERE worker.mgr = boss.empno;
可以看到我们成功的得到了13条记录,少的一条记录就是king,其是最大的boss,其mgr是null。
2.总结
自连接的特点
- 把同一张表当做两张表使用
- 需要给表取别名
- 列名不明确,可以指定列的别名 别名 as 列的别名