zoukankan      html  css  js  c++  java
  • inner join, left join, right join, full outer join的区别

     

    总的来说,四种join的区别可以描述为:

    left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。

    right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配

    full outer join 全连接,返回左右表中的所有记录

    在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。

    Join

    一共有三种OUTER JOIN:

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

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

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

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

    LEFT OUTER JOIN

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

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

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

    1. AA BB
    2. -------- --------
    3. Item 1
    4. Item 2
    5. Item 3 Item 3
    6. Item 4 Item 4

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

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

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

    RIGHT OUTER JOIN

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

    1. SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
    2.  
    3. AA BB
    4. -------- --------
    5. Item 3 Item 3
    6. Item 4 Item 4
    7. Item 5
    8. Item 6

    FULL OUTER JOIN

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

    1. SELECT * FROM A FULL JOIN B ON AA = BB
    2.  
    3. AA BB
    4. -------- --------
    5. Item 1 <-----+
    6. Item 2 |
    7. Item 3 Item 3 |
    8. Item 4 Item 4 |
    9. Item 5 +--- empty holes are NULL's
    10. Item 6 |
    11. ^ |
    12. | |
    13. +---------------------+

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

    INNER JOIN

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

    1. SELECT * FROM A INNER JOIN B ON AA = BB
    2.  
    3. AA BB
    4. -------- --------
    5. Item 3 Item 3
    6. Item 4 Item 4

    CROSS JOIN

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

    1. SELECT * FROM A CROSS JOIN B
    2.  
    3. AA BB
    4. -------- --------
    5. Item 1 Item 3 ^
    6. Item 1 Item 4 +--- A中第一个元素, 匹配B中所有元素
    7. Item 1 Item 5 |
    8. Item 1 Item 6 v
    9. Item 2 Item 3 ^
    10. Item 2 Item 4 +--- A中第二个元素, 匹配B中所有元素
    11. Item 2 Item 5 |
    12. Item 2 Item 6 v
    13. Item 3 Item 3 ... and so on
    14. Item 3 Item 4
    15. Item 3 Item 5
    16. Item 3 Item 6
    17. Item 4 Item 3
    18. Item 4 Item 4
    19. Item 4 Item 5
    20. Item 4 Item 6
  • 相关阅读:
    LeetCode
    LeetCode
    Django ORM 查询
    The Usage of Pymongo
    MongoDB基操
    Django内置auth模块中login_required装饰器用于类视图的优雅方式
    Django Session配置
    Python虚拟环境
    遇见Flask-Script
    Git使用手册
  • 原文地址:https://www.cnblogs.com/halberd-lee/p/10979883.html
Copyright © 2011-2022 走看看