zoukankan      html  css  js  c++  java
  • 换个角度看表连接

    外连接的基础概念

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

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

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

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

    imgimg

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

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

    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;
    

    img

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

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

    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;
    

    img

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

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

    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 将两个结果集合并起来。

    -- 使用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」

    img

    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;
    

    img

    并集

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

    img

    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;
    

    img

    差集

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

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

    img

    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;
    

    img

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

    img

    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;
    

    img

    异或集

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

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

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

    用全外连接求异或集

    img

    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;
    

    img


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

    作者:CoderFocus

    微信公众号:

    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,不妨点击一下下方的推荐按钮,谢谢支持。转载与引用请注明作者及出处。

  • 相关阅读:
    Quartz.Net进阶之一:初识Job作业和触发器
    Sql Server 三个很有用的函数
    Quartz.NET快速入门指南
    VS2015 提示 无法启动 IIS Express Web 服务器
    sql like 另一个表的字段
    Python3快速入门--Python多线程编程
    seo-网站变化百度搜索引擎的影响
    Asp.NetCore 3.1 EFCore处理Mysql的分库分表--MyCat解决方案
    asp.net core 3.1里 EF的事务-代码示例
    Asp.netCore3.1 Blazor入门
  • 原文地址:https://www.cnblogs.com/songwenjie/p/10206987.html
Copyright © 2011-2022 走看看