天涯论坛

 找回密码
 立即注册
搜索
查看: 74|回复: 4

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

[复制链接]

2835

主题

316

回帖

9191万

积分

论坛元老

Rank: 8Rank: 8

积分
91919712
发表于 2024-8-4 09:50:02 | 显示全部楼层 |阅读模式

上节课咱们大众介绍了常用的MySQL多表联合查找用法,晓得了left join /right join /inner join 的基本用法。本节课咱们继续展开讲讲MySQL多表联合查找的其他用法——全连接与笛卡尔连接。

01

全连接union&union all

首要看什么是全连接,详细能够看以下韦恩图。

全连接full outer join

全连接定义:全连接全叫作为全外连接,它是外连接的一种。它将上下两个表经过ON进行要求连接,并且最后列出上下两个表的所有记录。

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

【union】

SELECTa.PassengerId,a.name,b.survived,b.pclass,a.phonebrandfrom phone a left join titanic b on a.PassengerId=b.passengerId where a.phonebrand="HUAWEI" UNION SELECTa.passengerId,a.name,b.survived,b.pclass,a.phonebrandfrom phone a right join titanic b on a.PassengerId=b.passengerId where b.survived=1 and b.pclass=3;

运用union查找结果如下

union 查找结果

【union all】

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 all查找结果

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

经过union连接的查找语句前后分别单独取出的列数必要相同;在不需求合并的前后列名叫作同期,输出结果以合并前的第1段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,其基本用法如下。(因为结果太大,咱们就不实质运行了)

SELECT * from phone a cross join titanic b

03

总结

以上便是咱们本节课要介绍的所有内容,总结一下:

在MySQL中不支持全连接的用法,不外咱们能够运用union或union all 对前后结果进行合并。union会对合并结果进行去重,而union all 不会对合并结果进行去重,但union的计算量显然更大,运行效率union all高。笛卡尔连接cross join是对两个表的所有行记录进行乘积,计算量巨大,通常实质中不举荐运用




上一篇:mysql 外连接总结
下一篇:C++中的外边链接性和内部链接性:探究其区别与应用
回复

使用道具 举报

0

主题

586

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-10 11:38:36 | 显示全部楼层
交流如星光璀璨,点亮思想夜空。
回复

使用道具 举报

2946

主题

2万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979427
发表于 2024-10-5 09:51:44 | 显示全部楼层
“BS”(鄙视的缩写)‌
回复

使用道具 举报

3070

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158931
发表于 2024-10-11 19:20:05 | 显示全部楼层
感谢你的精彩评论,带给我新的思考角度。
回复

使用道具 举报

3123

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108625
发表于 2024-10-18 08:13:51 | 显示全部楼层
我深受你的启发,你的话语是我前进的动力。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 04:15 , Processed in 0.105071 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.