前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于MySQL内连接与外连接用法,全都在这里了!

关于MySQL内连接与外连接用法,全都在这里了!

作者头像
用户7569543
发布2021-11-12 14:51:30
1.9K0
发布2021-11-12 14:51:30
举报

上节课我们给大家介绍了常用的MySQL多表联合查询用法,知道了left join /right join /inner join 的基本用法。具体请回顾关于MySQL多表联合查询,你真的会用吗?本节课我们继续展开讲讲MySQL多表联合查询的其他用法——全连接与笛卡尔连接。

01

全连接union&union all

首先看什么是全连接,具体可以看以下韦恩图。

全连接定义:全连接全称为全外连接,它也是外连接的一种。它将左右两个表通过ON进行条件连接,并且最后列出左右两个表的所有记录。

但在MySQL中,它是不支持全连接这种用法的,不过可以使用union或union all进行弥补。例如,现在我们想把上节课左连接与右连接的结果合并起来,即我们想把使用华为手机的乘客编号、姓名、是否幸存、船舱等级和手机品牌船舱等级为3且存活的乘客编号、姓名、是否幸存、船舱等级和手机品牌两种查询结果合并,我们看分别使用union和union all该怎么做。

【union】

代码语言:javascript
复制
SELECT a.PassengerId,a.name,b.survived,b.pclass,a.phonebrand
from phone a 
left join titanic b 
on a.PassengerId=b.passengerId
where a.phonebrand="HUAWEI"
UNION
SELECT a.passengerId,a.name,b.survived,b.pclass,a.phonebrand
from phone a 
right join titanic b 
on a.PassengerId=b.passengerId
where  b.survived=1
and b.pclass=3;

使用union查询结果如下

【union all】

代码语言:javascript
复制
SELECT a.PassengerId,a.name,b.survived,b.pclass,a.phonebrand
from phone a 
left join titanic b 
on a.PassengerId=b.passengerId
where a.phonebrand="HUAWEI"
UNION all
SELECT a.passengerId,a.name,b.survived,b.pclass,a.phonebrand
from phone a 
right join titanic b 
on a.PassengerId=b.passengerId
where  b.survived=1
and b.pclass=3;

使用union all 查询结果如下

可以看到,相同的查询语句union的查询结果为23行记录,而union all 的查询结果为131行记录。因此,可以简单总结union 与union all 两种查询结果的要点与区别如下:

  • 通过union连接的查询语句前后分别单独取出的列数必须相同;
  • 在不要求合并的前后列名称相同时,输出结果以合并前的第一段SQL列名称为准;
  • union会对合并结果进行去重,而union all 只是简单对前后查询结果进行合并,不会去重;
  • 不推荐在union 或union all语句中进行order by 排序操作。

02

笛卡尔连接cross join

MySQL笛卡尔连接是MySQL中的一种连接方式,区别于内连接和外连接,对于cross join连接来说,其实使用的就是笛卡尔连接。在MySQL中,当两个表使用了笛卡尔连接时,cross join会产生一个结果集,该结果集是两个关联表的行的乘积。通常,如果每个表分别具有n和m行,则结果集将具有n*m行。

例如,我们已知phone表有2097006行记录,titanic表有891行记录,那么两者做笛卡尔连接的总记录数就是2097006x891=1868432346,其基本用法如下。(由于结果太大,我们就不实际运行了)

代码语言:javascript
复制
SELECT * from phone a 
cross join titanic b

03

总结

以上就是我们本节课要介绍的全部内容,总结一下:

  • 在MySQL中不支持全连接的用法,不过我们可以使用union或union all 对前后结果进行合并。
  • union会对合并结果进行去重,而union all 不会对合并结果进行去重,但union的计算量显然更大,运行效率没有union all高。
  • 笛卡尔连接cross join是对两个表的所有行记录进行乘积,计算量巨大,一般在实际中不推荐使用。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 多赞云数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档