赞
踩
如上图是MySQL的七种连接
由于MySQ对于外连接支持SQL99语法,我们就以JOIN...ON举例
表t_dept 表t_emp
1.内连接:A表,B表交叉的部分
- SELECT *
- FROM t_dept d INNER JOIN t_emp e
- ON d.id = e.deptid;
INNER可省略,执行结果如下
2.左外连接:A表,B表交叉的部分和A表独有的部分
- SELECT *
- FROM t_dept d LEFT OUTER JOIN t_emp e
- ON d.id = e.deptid
OUTER可省略,执行结果如下
3.右外连接:A表,B表交叉的部分和B表独有的部分
- SELECT *
- FROM t_dept d RIGHT JOIN t_emp e
- ON d.id = e.deptid
注意看上面两个结果的最后一行,我们可以发现两个表合起来以后在另外一张表中没有内容的地方用null填充了,如此一来左中图和右中图咱们就能写出来了。比如找A表独有的部分就面向A表写个外连接,再加上一个条件 B表的连接条件为null(本例中是d.id或e.deptid)
4.左中图:A表特有的
- SELECT *
- FROM t_dept d LEFT JOIN t_emp e
- ON d.id = e.deptid
- WHERE e.deptid IS NULL
5.右中图:B表特有的
- SELECT *
- FROM t_dept d RIGHT JOIN t_emp e
- ON d.id = e.deptid
- WHERE d.id IS NULL
6.右下图:就是上面两个图合起来啦 那怎么合起来呢,就会用到UNION关键字
UNION:合并去重,效率低
UNION ALL:合并不去重,效率高
这里两个都可以用,因为左中图和右中图本来就没有重合的部分,就用效率高的UNION ALL好了。
- SELECT *
- FROM t_emp e LEFT JOIN t_dept d
- ON e.deptid = d.id
- WHERE d.id IS NULL
- UNION ALL
- SELECT *
- FROM t_emp e RIGHT JOIN t_dept d
- ON e.deptid = d.id
- WHERE e.id IS NULL
7.满外连接:MySQL不支持FULL JOIN,需要合并操作,我们用效率高的UNION ALL就得选没有重合的两个图,这里以右外连接和左中图合并为例
- SELECT *
- FROM t_emp e RIGHT JOIN t_dept d
- ON e.deptid = d.id
- UNION ALL
- SELECT *
- FROM t_emp e LEFT JOIN t_dept d
- ON e.deptid = d.id
- WHERE d.id IS NULL
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。