图解SQL的连接:左连接、右连接、全连接、内连接、自然连接

SQL的连接分为三类:

  • 外连接(包括左连接left join、右连接right join、全连接full join)
  • 内连接 inner join
  • 自然连接 natural join

       

       

我们来看一个超级简单的例子(下面的地址单词写错了,每个图都要重改太麻烦了):

        现在有两个表,一个是student_name学生姓名,有id和name(姓名)两个属性,一个是student_adress学生地址,有id和adress(地址)两个属性。两个表都有 id 1,2,3,如图:
在这里插入图片描述

       

       

左连接

select * from 
student_name left join student_adress 
on student_name.id=student_adress.id;

        以id作为连接条件,左连接表示以左边这个表为基准,去匹配右边这个表,如果右边的表有同样的id,就合成一行。如果没有(比如地址表没有id5,6),缺的字段就会用NULL补齐。
在这里插入图片描述
       

       

右连接

select * from 
student_name right join student_adress 
on student_name.id=student_adress.id;

        以id作为连接条件,右连接表示以右边这个表为基准,去匹配左边这个表,如果左边的表有同样的id,就合成一行。如果没有(比如姓名表没有id7,8),缺的字段就会用NULL补齐。可以和左连接的图对比着看。
在这里插入图片描述
       

       

全连接

select * from student_name full join student_adress ;

        全连接将两个表就主键进行了一个笛卡儿积,比如姓名表id有5个,地址表id有5个,最后就会产生一个5*5行的表。
在这里插入图片描述
       

       

内连接

select * from 
student_name inner join student_adress 
on student_name.id=student_adress.id;

        内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。内连接返回的结果是两个表中都有的字段,这里是id1,2,3。

       

       

自然连接

select * from student_name natural join student_adress ;

        自然连接是通过对表关系中同名的属性对取等来完成的,无须自己添加连接条件(后面不用接on指定以什么字段连接)。自然连接和内连接的结果基本相同,都是返回两表都有的字段,这里是id1,2,3。
        不同的是,看图,内连接返回的是两列id,自然连接返回的是一列id。
在这里插入图片描述

       

       

       

内连接和自然连接的区别?

一、

  • 自然连接只能是同名属性的等值连接。
  • 内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。

        什么意思呢,就是说,如果现在地址表的id属性名改为了sid,而姓名表的id属性名仍然是id。如图,那么仍可以对两表进行内连接,只需要指定连接条件为 on student_name.id=student_adress.sid 就可以了。但是下面这两个表不能进行自然连接了,因为他们没有同名属性(id和sid不同名)。
在这里插入图片描述
二、

  • 自然连接返回的同名属性列只有一列
  • 内连接返回两列
    在这里插入图片描述

       

        如果此时你要进行select操作,注意!!!
        自然连接 select id from student_name natural join student_adress ;可以,因为自然连接的id只有一列。

        但是内连接 select id from student_name inner join student_adress on student_name.id=student_adress.id;会报错,因为内连接返回的id有两列!!!必须指明要选择的是来自哪个表的id。
        改成 select student_name.id from student_name inner join student_adress on student_name.id=student_adress.id;就可以了。

        可以参考SQL语句错误 Error Code: 1052. Column ‘id‘ in field list is ambiguous

  • 11
    点赞
  • 31
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

舒泱

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值