专栏首页A2Data多表操作之列关联(二)

多表操作之列关联(二)

本文标识 : MQ0014

本文编辑 : 长安月下赏美人儿

编程工具 : MySQL、DBeaver

阅读时长 : 8分钟

目录

前言

外连接分类

左连接

全连接

前言

上周和小伙伴儿们一起分享了《多表操作之列关联(一)》,主要涉及到交叉连接和内连接,此篇则详细介绍外连接的相关信息。也许会有困惑,为啥单独介绍外连接,是因为其骨骼惊奇么?!小编在此郑重声明,之所以单独介绍外连接,主要是因为其特别有趣,特别精彩,尤其是里面的左连接更是在日常工作中被频繁翻牌子!

外连接分类

外连接根据连接方式的不同,分为两种类。其中,左连接和右连接,原理一致,但也分两种不同的情况,全连接亦然如此。具体类别如下图所示。

  • 左连接、右连接
  • 全连接

图示所示:

左连接

左连接与右连接原理一致,故搞懂左连接两种不同场景,也将顺利解锁右连接的奥秘。

LEFT JOIN:以左表为主表,通过相同意义的字段与右表连接,返回左表的全部数据行,以及右表中匹配的记录,如果右表中没有匹配,则用字段 NULL 来填充。听起来很简单有没有?!但是,事情的经过并不是这个样子的,实践是检验真理的唯一标准,实际操作过程中的坑坑洼洼在所难免。

场景一:LEFT JOIN 包含两表交集

# LEFT JOIN 场景一基础语法:
SELECT <select_list>
FROM TableA A
LEFT JOIN TableB B
ON A.Key = B.Key;

在左连接场景一中,根据两表连接关键字的不同,又细分为3种情况。

1、一对一

通俗的讲,A 表与 B 表连接的关键字内的信息值,两者一一对应。即 A.Key 中的信息,在 B.Key 中有且仅有唯一对应值。譬如,前者里面有 1 ,后者里面有且仅有一个 1 。

数据背景:数据表 t1 ,数据表 t2

SELECT * FROM t1 A
LEFT JOIN t2 B
ON A.id=B.id;

数据结果:

2、一对多

通俗的讲,A 表与 B 表连接的关键字内的信息值,前者关键字内信息值各自独立,后者关键字内信息值出现多个重复值。即 A.Key 中的信息,在 B.Key 中有多个对应值。譬如,前者里面有 1 ,后者里面有 2 个 1 。

数据背景:数据表 t1 ,数据表 t2

SELECT * FROM t1 A
LEFT JOIN t2 B
ON A.id=B.id;

数据结果:

逻辑解析:

(1)数据表 t1 中,有 4 条数据,且 id 各自独立;

(2)数据表 t2 中,有 4 条数据,但 id=2 的数据有 2 条;

(3)当 id=2 的时候,在表 t2 中有 2 条满足和表 t1 中 id=2 进行匹配;

(4)故,返回的结果是 5 条,其中 2 条数据 id=2。

3、多对多

通俗的讲,A 表与 B 表连接的关键字内的信息值,前者与后者关键字内信息值出现多个重复值。即 A.Key 中有重复信息,在 B.Key 中有多个对应值。譬如,前者里面有 2 个 1 ,后者里面有 2 个 1 。

数据背景:数据表 t1 ,数据表 t2

SELECT * FROM t1 A
LEFT JOIN t2 B
ON A.id=B.id;

数据结果:

逻辑解析:

(1)数据表 t1 中,有 6 条数据,且 id=1、id=2 各有 2 条数据;

(2)数据表 t2 中,有 7 条数据,且 id=1、id=2 各有 2 条数据;

(3)当 id=1 ,name=‘大毛’ 的时候,在表 t2 中有 2 条满足和表 t1 中 id=2 进行匹配,以此类推;

(4)故,返回的结果是 10 条,其中 id=1、id=2 各有 4 条数据。

场景二:LEFT JOIN 不包含两表交集

# LEFT JOIN 场景二基础语法:
SELECT <select_list>
FROM TableA A
LEFT JOIN TableB B
ON A.Key = B.Key
WHERE  B.Key IS NULL;

数据背景:数据表 t1 ,数据表 t2

#例1
SELECT * FROM t1 A
LEFT JOIN t2 B
ON A.id=B.id
WHERE B.id IS NULL;

数据结果:

#例2
SELECT * FROM t1 A
LEFT JOIN t2 B
ON A.name=B.name
WHERE B.name IS NULL;

数据结果:

左连接小结:

  • 在进行多表连接之前,查看清楚连接的关键字是否唯一,如果不唯一,则要考虑清楚选择哪个字段作为关键字
  • 在留存交集的情况下,考虑清楚三种不同的连接情况,确定想要的数据模式
  • 如果想对右表进行限制,则一定要在 on 条件中进行
  • 如果想对连接之后的数据进行过滤,则一定要在 where 条件中进行
  • 如果没有 where 条件,无论 on 条件对两表怎么限制,左表的每一行至少会有一行的合成结果

全连接

全连接,就是将要连接的各表的所有信息进行融合。简单粗暴的讲,就是取并集,用数学符号表示就是 集合A ∪ 集合 B

场景一:FULL OUTER JOIN 包含两表交集

# FULL  OUTER JOIN 场景一基础语法:
SELECT <select_list> FROM TableA A
LEFT JOIN TableB B
ON A.Key = B.Key
WHERE <限制条件>
UNION
SELECT <select_list> FROM TableA A
RIGHT JOIN TableB B
ON A.Key = B.Key
WHERE <限制条件>;

数据背景:数据表 t1 ,数据表 t2

SELECT * FROM t1
LEFT JOIN t2
ON t1.name=t2.name
UNION
SELECT * FROM t1
RIGHT JOIN t2
ON t1.name=t2.name;

数据结果:

注意:如果直接关联两表会如何?

(还记得之前学习的行关联么?!)

SELECT*FROM t1 
UNION
SELECT * FROM t2;

数据结果:

场景二:FULL OUTER JOIN 不包含两表交集

# FULL OUTER JOIN 场景二基础语法:
SELECT <select_list> FROM TableA A
LEFT JOIN TableB B
ON B.Key IS NULL
UNION
SELECT <select_list> FROM TableA A
RIGHT JOIN TableB B
ON A.Key IS NULL;

数据背景:数据表 t1 ,数据表 t2

SELECT * FROM t1
LEFT JOIN t2
ON t1.name=t2.name
WHERE t2.name IS NULL
UNION
SELECT * FROM t1
RIGHT JOIN t2
ON t1.name=t2.name
WHERE t1.name IS NULL;

数据结果:

逻辑解析:

(1)数据表 t1 与 t2 中,以 name 为连接关键词,重复的数据有‘二毛’、‘小明’;

(2)两数据表左连接,且不包含交集

(3)两数据表右连接,且不包含交集

(4)对查询结果关联即可得到结果

全连接小结:

  • 进行数据表全连接的同时,要注意是否包含交集

注意:关于全连接,有的资料显示,可以直接用 FULL OUTER JOIN 句式,但小编在 DBeaver 中尝试失败,感兴趣的小伙伴儿可以去尝试一下。

# FULL OUTER JOIN 场景一基础语法:
SELECT <select_list> FROM TableA A
FULL OUTER JOIN TableB B
ON A.Key=B.Key;

# FULL OUTER JOIN 场景二基础语法:
SELECT <select_list> FROM TableA A
FULL OUTER JOIN TableB B
WHERE A.Key IS NULL
OR B.Key IS NULL

本文分享自微信公众号 - DataScience(DataScienceTeam),作者:长安月下赏美人儿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多表操作之列关联(一)

    上文介绍了相对简单的《多表操作之行关联》,本文则分享一小部分有关多表操作的列关联知识。其较于前者,明显更为复杂,其主要关键词为 JOIN,这也是在查询中非常常见...

    DataScience
  • 21 幅 GIF 动图让你了解各种数学概念

    “让我们面对它;总的来说数学是不容易的,但当你征服了问题,并达到新的理解高度,这就是它给你的回报。”

    DataScience
  • Linux 第二天

    Zip 格式解压 (有时候我们直接将本地的zip格式的文件 Put上去 该如何解压呢?)

    DataScience
  • 世界旅游城市联合会在WTM主办 “智慧旅游城市最佳实例”论坛 ​| 数字文旅周报37期(11.11-11.17)

    ? 世界旅游城市联合会在WTM主办 “智慧旅游城市最佳实例”论坛 近日,2019年世界旅游交易会(WTM)开幕,隔天,世界旅游城市联合会作为WTM内容合作伙伴...

    腾讯文旅
  • python3_06_01.模块之os

    py3study
  • rpc框架之HA/负载均衡构架设计

    thrift、avro、grpc之类的rpc框架默认都没有提供负载均衡的实现,生产环境中如果server只有一台,显然不靠谱,于是有了下面的设计,这其实是前一阵...

    菩提树下的杨过
  • [Java 8 HashMap 详解系列]4.HashMap 的 get() 方法执行原理

    https://blog.csdn.net/xiangwanpeng/article/details/54946015

    一个会写诗的程序员
  • 同源策略和跨域解决方案

    下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: 

    py3study
  • 对后端开发的理解

    参考: https://www.zhihu.com/question/23084473

    平凡的学生族
  • 如何学习数据库系统知识

    不少读者留言提了两个问题: 我能不能多讲讲我的文章里提到的基本概念,比如MPP。或者干脆开个数据库系统基础系列。 怎么样去学习数据库系统的知识。 所以我开贴简...

    用户1564362

扫码关注云+社区

领取腾讯云代金券