一、连接说明
union
、intersect
等集合运算,它的特征是以 “行” 为单位进行操作,通俗点说,就是进行这些集合运算,会导致记录行数的增减,使用union
会增加记录行数,使用 intersect
或 expect
会减少行记录,集合运算不会导致 “列” 数量的改变。而连接(join
) 操作,就是将其他表中的列添加过来,进行 “列添加”的运算。当需要从多张表中取出不同的列组成一个新的查询结果时,就需要用的连接(join
)运算了。以下是几种连接运算的简单说明。
1、join 和 inner join
join
和 inner join
是一样的,为了简写省掉 inner
可直接写为 join
, 内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联就不额外显示出来,如下:
2、left join 左连接
left join
左连接,表A left join
表B,以左为主,表示以表A为主,关联上表B的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。如下
3、right join 右连接
right join
右连接,表A right join
表B,以右为主,表示以表B为主,关联查询表A的数据,查出表B所有数据以及表A和表B有交集的数据,如下:
4、outer join
outer join
在MySQL
中, 外连接必须指定主表,需指定左右,也即 left outer join
,right outer join
,实际上,就是 left join
和 right join
,为了方便书写把outer
省略掉了,在Oracle
中,支持全外连接,即 full outer join
;
5、交叉连接 CROSS JOIN
交叉连接 CROSS JOIN
(也就是耳熟能详的的笛卡尔积),交叉连接的结果是两个表中行数的乘积,交叉连接的结果中包含了内连接,外连接,全连接的所有结果。实际业务中很少会使用交叉连接,因为交叉连接的记过没有实用价值,运算结果函数太多,需要浪费很多运算性能。
6、连接总结
下图可以囊括连接的所有情况
二、案例
1、表结构
(1)stu表
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王二 |
(2)score表
id | fk_stu | score |
---|---|---|
1 | 1 | 10 |
2 | 2 | 20 |
4 | 4 | 40 |
2、内连接
select * from stu join score on stu.id = score.fk_stu;
id | name | id(1) | fk_stu | score |
---|---|---|---|---|
1 | 张三 | 1 | 1 | 10 |
2 | 李四 | 2 | 2 | 20 |
3、左连接
select * from stu left join score on stu.id = score.fk_stu;
id | name | id(1) | fk_stu | score |
---|---|---|---|---|
1 | 张三 | 1 | 1 | 10 |
2 | 李四 | 2 | 2 | 20 |
3 | 王二 |
4、右连接
select * from stu right join score on stu.id = score.fk_stu;
id | name | id(1) | fk_stu | score |
---|---|---|---|---|
1 | 张三 | 1 | 1 | 10 |
2 | 李四 | 2 | 2 | 20 |
4 | 4 | 40 |
5、全连接
select * from stu full join score on stu.id = score.fk_stu;
id | name | id(1) | fk_stu | score |
---|---|---|---|---|
1 | 张三 | 1 | 1 | 10 |
2 | 李四 | 2 | 2 | 20 |
4 | 4 | 40 | ||
3 | 王二 |
6、交叉连接
select * from stu cross join score;
1 | 张三 | 1 | 1 | 10 |
---|---|---|---|---|
2 | 李四 | 1 | 1 | 10 |
3 | 王二 | 1 | 1 | 10 |
1 | 张三 | 2 | 2 | 20 |
2 | 李四 | 2 | 2 | 20 |
3 | 王二 | 2 | 2 | 20 |
1 | 张三 | 4 | 4 | 40 |
2 | 李四 | 4 | 4 | 40 |
3 | 王二 | 4 | 4 | 40 |