• SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)


    四种JOIN的使用/区别描述

    left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
    
    right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
    
    full outer join 全连接,返回左右表中的所有记录
    
    在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。

    具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。

    JOIN

    一共有三种OUTER JOIN:

    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN

    关键字OUTER是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOINFULL OUTER JOIN是一样的。

    接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。

    Set "A"    Set "B"
    
     AA         BB
    --------   --------
     Item 1     Item 3
     Item 2     Item 4
     Item 3     Item 5
     Item 4     Item 6

    LEFT OUTER JOIN

    现在执行如下SQL语句(左连接,LEFT OUTER JOIN):

    SELECT * FROM A LEFT OUTER JOIN B ON AA = BB

    将会得到如下的结果(空白的元素表示NULL):

    AA         BB
    --------   --------
     Item 1
     Item 2
     Item 3     Item 3
     Item 4     Item 4

    左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL

    因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:

    SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
    WHERE BB is NULL

    RIGHT OUTER JOIN

    如果使用右连接,结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):

    SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
    
     AA         BB
    --------   --------
     Item 3     Item 3
     Item 4     Item 4
                Item 5
                Item 6

    FULL OUTER JOIN

    如果想要取得所有的元素项,则可以使用FULL JOIN:

    SELECT * FROM A FULL JOIN B ON AA = BB
    
     AA         BB
    --------   --------
     Item 1            <-----+
     Item 2                  |
     Item 3     Item 3       |
     Item 4     Item 4       |
                Item 5       +--- empty holes are NULL's
                Item 6       |
       ^                     |
       |                     |
       +---------------------+

    再次注意,缺失的数据项的值是NULL

    INNER JOIN

    INNER JOINJOIN是一样的,一般INNER关键字可以省略。INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。

    SELECT * FROM A INNER JOIN B ON AA = BB
    
     AA         BB
    --------   --------
     Item 3     Item 3
     Item 4     Item 4

    CROSS JOIN

    最后还有一个CROSS JOIN,笛卡儿积,将会返回A中每个元素分别匹配B中所有元素的结果,即N*M组合。

    SELECT * FROM A CROSS JOIN B
    
     AA         BB
    --------   --------
     Item 1     Item 3      ^
     Item 1     Item 4      +--- A中第一个元素, 匹配B中所有元素
     Item 1     Item 5      |
     Item 1     Item 6      v
     Item 2     Item 3      ^
     Item 2     Item 4      +--- A中第二个元素, 匹配B中所有元素
     Item 2     Item 5      |
     Item 2     Item 6      v
     Item 3     Item 3      ... and so on
     Item 3     Item 4
     Item 3     Item 5
     Item 3     Item 6
     Item 4     Item 3
     Item 4     Item 4
     Item 4     Item 5
     Item 4     Item 6

    图解SQL的JOIN操作

    这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。

    更多参考资料

  • 相关阅读:
    tabbar 旋转指定的页面
    GDAL中文路径不能打开&Shp文件字段属性值中文乱码
    Project : error PRJ0019: 工具从"Moc'ing xxx.h..."
    详解Android中的屏幕方向
    qt中获取文件路径和文件名
    vs2005下Qt项目中修改exe图标的方法
    Qt & C/C++统计运行时间
    Qt 中Treewidget添加右键菜单
    QT 中文乱码解决方案
    Qt多线程应用QRunnable显示进度条示例
  • 原文地址:https://www.cnblogs.com/limengjie0104/p/9209810.html
Copyright © 2020-2023  润新知