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

本文深入解析SQL中的五种连接类型:左连接、右连接、全连接、内连接和自然连接。通过实例说明每种连接的特点及应用场景,帮助读者理解如何在实际数据库操作中正确选择连接方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

左连接连接是数据库中的两种连接方式,它们的区别在于连接的主表和次表的位置不同。 左连接(Left Join)是以左边的表为主表,将左表中的所有数据与表中匹配的数据连接在一起。如果左表中的某行在表中没有匹配的行,那么表中的数据将显示为空值。左连接的结果集包括左表的所有行,而不仅仅是与表匹配的行。\[1\] 连接(Right Join)是以边的表为主表,将表中的所有数据与左表中匹配的数据连接在一起。如果表中的某行在左表中没有匹配的行,那么左表中的数据将显示为空值。连接将返回表的所有行。\[3\] 总结起来,左连接连接的区别在于连接的主表和次表的位置不同,左连接以左表为主表,连接表为主表。左连接返回左表的所有行,连接返回表的所有行。 #### 引用[.reference_title] - *1* [SQL内连接左连接连接的区别](https://blog.csdn.net/coffeetogether/article/details/123664325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [图解数据库左连接连接内连接、外连接全连接的区别](https://blog.csdn.net/qq_27184497/article/details/119672665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [左连接连接内连接区别](https://blog.csdn.net/weixin_36098377/article/details/106482084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值