mysql · 2019-09-11 0

MySQL多表连接(交叉连接、自然连接、内连接、左外连接、右外连接)

准备

在数据库建立两张表

t_student 学生表:scid、sname、cid

scid sname cid
1 王宝强 2
2 黄渤 2
3 李易峰 1
4 李治廷 1
5 腾格尔

t_clazz 班级表:cid、cname

cid cname
1 颜值班
2 演技班
3 颜值演技班

1.交叉连接

交叉连接结果是笛卡尔积

左表的每条记录与右表的每条记录连接

SELECT * FROM t_student CROSS JOIN t_clazz ;

结果:15条记录

scid sname cid cid cname
1 王宝强 2 3 颜值演技班
1 王宝强 2 2 演技班
1 王宝强 2 1 颜值班
2 黄渤 2 3 颜值演技班
2 黄渤 2 2 演技班
2 黄渤 2 1 颜值班
3 李易峰 1 3 颜值演技班
3 李易峰 1 2 演技班
3 李易峰 1 1 颜值班
4 李治廷 1 3 颜值演技班
4 李治廷 1 2 演技班
4 李治廷 1 1 颜值班
5 腾格尔 3 颜值演技班
5 腾格尔 2 演技班
5 腾格尔 1 颜值班

2.自然连接

自然连接是对两个表之间相同名字和数据类型的列进行等值连接

SELECT * FROM t_student NATURAL JOIN t_clazz;

结果:4条记录

cid scid sname cname
2 1 王宝强 演技班
2 2 黄渤 演技班
1 3 李易峰 颜值班
1 4 李治廷 颜值班

3.内连接

查询出两个表的共同部分

(笛卡尔积满足on条件的部分)

SELECT * FROM t_student s INNER JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:4条记录

scid sname cid cid cname
1 王宝强 2 2 演技班
2 黄渤 2 2 演技班
3 李易峰 1 1 颜值班
4 李治廷 1 1 颜值班

4.左外连接

查询出两个表的共同部分+属于左表不属于右表部分

SELECT * FROM t_student s LEFT JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:5条记录

scid sname cid cid cname
1 王宝强 2 2 演技班
2 黄渤 2 2 演技班
3 李易峰 1 1 颜值班
4 李治廷 1 1 颜值班
5 腾格尔

5.右外连接

查询出两个表的共同部分+属于右表不属于左表部分

SELECT * FROM t_student s RIGHT JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:5条记录

scid sname cid cid cname
4 李治廷 1 1 颜值班
3 李易峰 1 1 颜值班
2 黄渤 2 2 演技班
1 王宝强 2 2 演技班
3 颜值演技班