准备
在数据库建立两张表
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 | 颜值演技班 |