首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多表操作之列关联(二)

多表操作之列关联(二)

作者头像
DataScience
发布2020-01-02 12:21:27
5250
发布2020-01-02 12:21:27
举报
文章被收录于专栏:A2DataA2Data

本文标识 : 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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 前言
  • 外连接分类
  • 左连接
  • 全连接
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档