数据库多表关联查询

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、右外连接

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 市场部

3、全外连接(注:mysql不支持全外连接

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 市场部

4、内连接

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、on(连接条件)和where(过滤条件)的区别

      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 ZL

SELECT  *
FROM student s LEFT JOIN dept d
ON s.dno = d.did
WHERE s.dno = 1;

结果:

1 ZS 1 1 研发部
2 LS 1 1 研发部



你可能感兴趣的:(数据库)