zoukankan      html  css  js  c++  java
  • 图解SQL的各种连接join[转]

    对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。我觉得清楚易懂,转过来。

    假设我们有两张表,Table A是左边的表,Table B是右边的表。

    其各有四条记录,其中有两条记录是相同的,如下所示:

    1 id name       id  name
    2 -- ----       --  ----
    3 1  Pirate     1   Rutabaga
    4 2  Monkey     2   Pirate
    5 3  Ninja      3   Darth Vader
    6 4  Spaghetti  4   Ninja

    下面让我们来看看不同的Join会产生什么样的结果。

    1 SELECT FROM TableA INNERJOIN TableB
    2 ON TableA.name = TableB.name
    3 id  name       id   name
    4 --  ----       --   ----
    5 1   Pirate     2    Pirate
    6 3   Ninja      4    Ninja

    Inner join
    产生的结果集中,是A和B的交集。

    01 SELECT FROM TableA FULLOUTER JOIN TableB
    02 ON TableA.name = TableB.name
    03 id    name       id    name
    04 --    ----       --    ----
    05 1     Pirate     2     Pirate
    06 2     Monkey     null  null
    07 3     Ninja      4     Ninja
    08 4     Spaghetti  null  null
    09 null    null    1     Rutabaga
    10 null    null    3     Darth Vader

    Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

    1 SELECT FROM TableA LEFTOUTER JOIN TableB ONTableA.name = TableB.name
    2 id  name       id    name
    3 --  ----       --    ----
    4 1   Pirate     2     Pirate
    5 2   Monkey      null    null
    6 3   Ninja      4     Ninja
    7 4   Spaghetti   null    null

    Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

    1 SELECT FROM TableA LEFTOUTER JOIN TableB ONTableA.name = TableB.nameWHERE TableB.id IS null
    2 id  name       id     name
    3 --  ----       --     ----
    4 2   Monkey  null    null
    5 4   Spaghetti   null    null

    产生在A表中有而在B表中没有的集合。

     
    1 SELECT FROM TableA FULLOUTER JOIN TableB ONTableA.name = TableB.nameWHERE TableA.id IS null ORTableB.id IS null
    2 id    name       id    name
    3 --    ----       --    ----
    4 2     Monkey    null    null
    5 4     Spaghetti null    null
    6 null    null    1     Rutabaga
    7 null    null    3     Darth Vader

    产生A表和B表都没有出现的数据集。

    还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

    1 SELECT FROM TableA
    2 CROSS JOIN TableB

    这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

    转自 

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/xiaobaxiing/p/6538689.html
Copyright © 2011-2022 走看看