关于MySQL内连接与外连接用法,全都在这里了!
上节课我们给大家介绍了常用的MySQL多表联合查询用法,知道了left join /right join /inner join 的基本用法。具体请回顾关于MySQL多表联合查询,你真的会用吗?本节课我们继续展开讲讲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是对两个表的所有行记录进行乘积,计算量巨大,一般在实际中不推荐使用。
相关文章
- MySQL之SQL优化实战记录
- Redis的各项功能解决了哪些问题?
- 看不惯云计算公司流氓行为,MongoDB 更改开源协议
- 树莓派自建NAS云盘之——云盘构建
- 如何为双活Redis Enterprise搭建基于Docker的开发环境?
- 不要这样写SQL 改掉这些坏习惯
- 数据库常用的事务隔离级别都有哪些?都是什么原理?
- 以Redis为例,详谈分布式系统缓存的细枝末节
- 想用数据库“读写分离” 请先明白“读写分离”解决什么问题
- 继续深入数据库 了解一下数据库的锁机制
- 数据库两大必备神器:索引和锁底层原理是什么!
- 分布式数据库TiDB在商业银行的设计与实践
- 这样做数据清理,可以避免引发MySQL故障
- 关于MySQL通用查询日志和慢查询日志分析
- OSDI '18重磅解密:蚂蚁金服实时金融级分布式图数据库GeaBase
- 高性能数据库连接池的内幕
- Redis为何这么快——数据存储角度
- Redis常见的几种使用方式解决方案总结
- 8种手动和自动备份MySQL数据库的方法
- 老司机也必须掌握的MySQL优化指南