zoukankan      html  css  js  c++  java
  • [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然

     

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

    假设我们有两张表,TableA是左边的表,TableB是右边的表。

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

    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会产生什么样的结果。

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

    1

    SELECT * FROM TableA INNER JOIN TableB

    2

    ON TableA.name = TableB.name

    3

    id 

    name 

    id 

    name 

    4

    -- 

    ---- 

    -- 

    ---- 

    5

    1

    Pirate 

    2

    Pirate 

    6

    3

    Ninja 

    4

    Ninja 

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

    01

    SELECT * FROM TableA FULL OUTER 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

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

    01

    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

    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

     

    01

    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

    02

    id 

    name 

    id 

    name 

    03

    -- 

    ---- 

    -- 

    ---- 

    04

    1

    Pirate 

    2

    Pirate 

    05

    2

    Monkey 

    null 

    null 

    06

    3

    Ninja 

    4

    Ninja 

    07

    4

    Spaghetti

    null 

    null 

    01

    SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

    02

    id 

    name 

    id 

    name 

    03

    -- 

    ---- 

    -- 

    ---- 

    04

    2

    Monkey 

    null 

    null 

    05

    4

    Spaghetti 

    null 

    null 

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

    01

    SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

    02

    id 

    name 

    id 

    name 

    03

    -- 

    ---- 

    -- 

    ---- 

    04

    2

    Monkey 

    null 

    null 

    05

    4

    Spaghetti 

    null 

    null 

    06

    null 

    null 

    1

    Rutabaga 

    07

    null 

    null 

    3

    Darth Vader 

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

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

    01

    SELECT * FROM TableA 

    02

    CROSS JOIN TableB 

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

     

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/Chary/p/No00008C.html
Copyright © 2011-2022 走看看