上节课咱们给大众介绍了常用的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 b03
总结
以上便是咱们本节课要介绍的所有内容,总结一下: 在MySQL中不支持全连接的用法,不外咱们能够运用union或union all 对前后结果进行合并。union会对合并结果进行去重,而union all 不会对合并结果进行去重,但union的计算量显然更大,运行效率无union all高。笛卡尔连接cross join是对两个表的所有行记录进行乘积,计算量巨大,通常在实质中不举荐运用。
|