前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >换个角度看表连接

换个角度看表连接

作者头像
撸码那些事
发布2019-03-04 15:08:46
5900
发布2019-03-04 15:08:46
举报
文章被收录于专栏:撸码那些事撸码那些事

图片来源:https://www.artic.edu

外连接的基础概念

标准SQL里定义了外连接的三种类型,如下:

  • 左外连接「LEFT OUTER JOIN」
  • 右外连接「RIGHT OUTER JOIN」
  • 全外连接「FULL OUTER JOIN」

在这三种中,左外连接和右外连接功能上没有什么区别,我们都比较熟悉,全外连接相对来说使用较少。

我们使用具体的实例说明,橘子、苹果同时属于两张表,而香蕉和菠萝分别只属于一张表。

(1)左外连接「LEFT OUTER JOIN」

左外连接是从两张内容不一致的表里确保获取左表全部数据

代码语言:javascript
复制
SELECT
    A.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
LEFT OUTER JOIN Basket_B B ON A.id = B.id;

(2)右外连接「RIGHT OUTER JOIN」

右外连接是从两张内容不一致的表里确保获取右表全部数据

代码语言:javascript
复制
SELECT
    B.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
RIGHT OUTER JOIN Basket_B B ON A.id = B.id;

(3)全外连接「FULL OUTER JOIN」

全外连接是从两张内容不一致的表里获取左右表全部数据,相当于左右表都是主表

代码语言:javascript
复制
SELECT
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
FULL OUTER JOIN Basket_B B ON A.id = B.id;

个别数据库不支持全外连接,可以分别进行左外连接和右外连接,再用 UNION 将两个结果集合并起来。

代码语言:javascript
复制
-- 使用UNION合并左外连接和右外连接代替全外连接
SELECT
    A.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
LEFT OUTER JOIN Basket_B B ON A.id = B.id
UNION 
SELECT
    B.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
RIGHT OUTER JOIN Basket_B B ON A.id = B.id;

用表连接进行集合运算

SQL是以「集合论」为基础的,我们可以换个角度,把「表」看成「集合」,把「表连接」看成「集合运算」。

交集

内连接相当于求集合的积 「INTERSECT」

代码语言:javascript
复制
SELECT
    A. id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
INNER JOIN Basket_B B ON A.id = B.id;

并集

全外连接相当于求集合的和 「UNION」

代码语言:javascript
复制
SELECT
    A.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
LEFT OUTER JOIN Basket_B B ON A.id = B.id
UNION 
SELECT
    B.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
RIGHT OUTER JOIN Basket_B B ON A.id = B.id;

差集

观察前面的全外连接结果集,我们可以发现,香蕉在表 BasketA 里存在而在表 BasketB 里不存在,「Bname」列是 NULL;相反,菠萝在表 BasketB 里存在而在表 BasketA 里不存在,「Aname」列是 NULL。所以,我们可以通过表连接后的某些字段是否为NULL来求得差集。

用外连接求差集「A - B」

代码语言:javascript
复制
SELECT
    A.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
LEFT OUTER JOIN Basket_B B ON A.id = B.id
WHERE B. NAME IS NULL;

用外连接求差集「B - A」

代码语言:javascript
复制
SELECT
    B.id,
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
RIGHT OUTER JOIN Basket_B B ON A.id = B.id
WHERE A. NAME IS NULL;

异或集

求两个集合的异或集有两种办法:

(1) ( A UNION B )- ( A INTERSECT B)

(2) ( A -B ) UNION ( B - A )

用全外连接求异或集

代码语言:javascript
复制
SELECT
    A. NAME AS A_name,
    B. NAME AS B_name
FROM
    Basket_A A
FULL OUTER JOIN Basket_B B ON A.id = B.id
WHERE A. NAME IS NULL
    OR B. NAME IS NULL;

SQL是以「集合论」为基础的,无论是表还是视图,本质上都是集合——集合是SQL唯一能处理的数据结构。从行数来看,表连接可以看做是表的乘法。使用连接便可以实现各种集合运算。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 外连接的基础概念
  • 用表连接进行集合运算
    • 交集
      • 并集
        • 差集
          • 异或集
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档