百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

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

wptr33 2025-02-26 14:04 14 浏览

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


01

全连接union&union all


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



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


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


【union】

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】

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,其基本用法如下。(由于结果太大,我们就不实际运行了)

SELECT * from phone a 
cross join titanic b


03

总结


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

  • 在MySQL中不支持全连接的用法,不过我们可以使用union或union all 对前后结果进行合并。


  • union会对合并结果进行去重,而union all 不会对合并结果进行去重,但union的计算量显然更大,运行效率没有union all高。


  • 笛卡尔连接cross join是对两个表的所有行记录进行乘积,计算量巨大,一般在实际中不推荐使用。

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...