知识点 左连接、右连接、内连接

为什么使用 这些X连接?

答:因为 我们想看到更多维度的数据,原本这些数据其实应该在一个表的,但为了避免数据冗余、面向对象(一张表一般对应一个实体类)等因素,我们把这些数据根据某个规则进行拆分了多张表。

外连接有:左连接、右连接、全连接(可以省略 outer关键字),即 外连接:不是一个具体的连接

内连接 就是内连接:可以省略 inner关键字

1、左连接:left  (outer) join

左表的所有行会显示,右表的 只有和左表匹配到的行才会显示。即: A表的全集+ AB表的交集

select * from A left Join B  on A.key=B.key

知识点 左连接、右连接、内连接_第1张图片

2、右连接:right (outer) join

右表的所有行会显示,左表的 只有和右表匹配到的行才会显示。 即:B表的全集+AB表的交集

select * from A  right join B on A.key=B.key

知识点 左连接、右连接、内连接_第2张图片

3、内连接:( inner)  join

两种表的公共部分进行显示,即: AB表的交集。注: inner 关键字可以省略

select * from A inner join B on A.key=B.key

或

select * from A join B on A.key=B.key

知识点 左连接、右连接、内连接_第3张图片

当B表的外键key  refer a表的key时,且join表示,用此key关联的时候,那么 inner join 和right join 的结果是一样的!因为B表有的,A表也都有。

5、全连接:full outer join

注:MySQL本身不支持你所说的full join(全连接),但可以通过union来实现 ,

A+B

select * from A full outer join B on A.key=B.key

知识点 左连接、右连接、内连接_第4张图片

A+B-(AB交集)

select * from A full outer join B on A.key=B.key 
where ( A.key is null or B.key is null )

知识点 左连接、右连接、内连接_第5张图片

A的独有:

select * from A left join B on A.key=B.key where B.key  is null

注:切记不可写成 select * from A left join B on A.key=B.key  where B.key  = null

因为 null 是一种特有的数据类型,其等价于没有任何值、是未知数。NULL与0、空字符串、空格都不同

知识点 左连接、右连接、内连接_第6张图片

 B的独有:

select * from A right join B on A.key=B.key  where A.key  is null

 知识点 左连接、右连接、内连接_第7张图片

扩展:

左右链接:使用久了会以为 : 

假如A表有10条数据,B表有5条数据

A left join B 一定是 10条吗? 不一定  结果肯定》=10 因为 链接的属性 在A表中的同一个值在B表中可能对应两条值,所以可能是11条数据:

例如:student表有2条数据,class表有2条数据,当 student left join class  ,结果出现了3条数据

执行:

select * from student s left join class c on  s.student_id=c.student_id

结果:

知识点 左连接、右连接、内连接_第8张图片

全连接:

就是笛卡尔乘积,两个表的每行匹配

你可能感兴趣的:(知识点 左连接、右连接、内连接)