SQL三种连接:内连接、外连接、交叉连接

本文详细介绍了SQL中的三种连接方式:交叉连接、内连接和外连接,包括左外连接、右外连接和完整外连接。通过具体的查询示例,解释了每种连接在处理两个表数据时的不同之处,帮助理解如何根据需求选择合适的连接方式。

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


准备两张表并以PersonId相关联。
在这里插入图片描述

一、交叉连接(CROSS JOIN)

交叉连接返回被连接的两个表所有数据行的笛卡尔积。

// 这两句sql完全等价
select * from person CROSS JOIN address
select * from person, address

查询结果:
在这里插入图片描述

二、内连接(INNER JOIN)

内连接可以获取两表的公共部分的记录,即利用条件表达式来消除交叉连接的某些数据行。

// 这两句sql完全等价
select * from person INNER JOIN address ON person.PersonId = address.PersonId 
select * from person, address WHERE person.PersonId = address.PersonId 

查询结果:注意此处PersonId = 4的小孙并未输出
所以内连接只查询两表中都包合的数据
在这里插入图片描述

三、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)

注意:外连接时,应注意where与on的区别

  • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

1.左外连接

左向外联接的结果集包括指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)

select * from person LEFT JOIN address ON person.PersonId = address.PersonId 

查询结果:注意此处PersonId = 4的‘小孙’也输出并且由于‘小孙’不存在对应的address,所以address的数据置为null
在这里插入图片描述

2.右外连接

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值(null)

select * from person RIGHT JOIN address ON person.PersonId = address.PersonId 

查询结果:注意此处AddressId = 6的‘广东’也输出并且由于‘广东’不存在对应的person,所以preson的数据置为null
在这里插入图片描述

3.完整外连接

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值(null)
Mysql中不支持FULL JOIN,所以这里用UNION联合查询代替

select * from person LEFT JOIN address ON person.PersonId = address.PersonId 
UNION
select * from person RIGHT JOIN address ON person.PersonId = address.PersonId 

查询结果:同时输出了'小孙'以及'广东'
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ostrich5yw

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值