20170630第一次写博客!!!
最近在使用多表关联查询注意到一些之前没有发现的细节问题,特此整理加强记忆和理解。
多表关联查询,两个表之间连接关系可分为左外连接left [outer] join,右连接right [outer] join,全外连接full [outer] join,内连接[inner] join。举例说明下
table student
SID | NAME | DNO |
1 | ZS | 1 |
2 | LS | 1 |
3 | WW | 2 |
4 | ZL |
table dept
DID | DNAME |
1 | 研发部 |
2 | 测试部 |
3 | 市场部 |
1、左外连接
SELECT *
FROM student s LEFT OUTER JOIN dept d
ON s.dno = d.did;
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
3 WW 2 2 测试部
4 ZL
2、右外连接
3、全外连接(注:mysql不支持全外连接)SELECT *
FROM student s RIGHT OUTER JOIN dept d
ON s.dno = d.did;
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
3 WW 2 2 测试部
3 市场部
4、内连接SELECT *
FROM student s FULL OUTER JOIN dept d
ON s.dno = d.did;
mysql中实现全外接连的变相方法:
SELECT *
FROM student s LEFT OUTER JOIN dept d
ON s.dno = d.did
UNION
SELECT *
FROM student s RIGHT OUTER JOIN dept d
ON s.dno = d.did;
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
3 WW 2 2 测试部
4 ZL
3 市场部
5、on(连接条件)和where(过滤条件)的区别SELECT *
FROM student s INNER JOIN dept d
ON s.dno = d.did
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
3 WW 2 2 测试部
等价于
SELECT *
FROM student s,dept d
where s.dno = d.did;(注:这里没有使用join,所以别习惯性的使用on)
5.1 在inner join中on和where的效果是相同的
SELECT *
FROM student s INNER JOIN dept d
ON s.dno = d.did
AND s.dno = 1;
等价于
SELECT *
FROM student s INNER JOIN dept d
ON s.dno = d.did
WHERE s.dno = 1;
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
5.2 外连接,以左外连接为例。
在使用left jion时,on和where条件的区别如下:
1) on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2)where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
SELECT *
FROM student s LEFT JOIN dept d
ON s.dno = d.did
AND s.dno = 1;
结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部
3 WW 2
4 ZLSELECT *
FROM student s LEFT JOIN dept d
ON s.dno = d.did
WHERE s.dno = 1;结果:
1 ZS 1 1 研发部
2 LS 1 1 研发部