posts - 28, comments - 37, trackbacks - 0, articles - 0

          jion介紹

          Posted on 2011-07-01 15:06 俞靈 閱讀(302) 評論(0)  編輯  收藏
          本文轉(zhuǎn)自 http://coolshell.cn/articles/3463.html

          對于SQL的Join,在學(xué)習(xí)起來可能是比較亂的。我們知道,SQL的Join語法有很多inner的,有outer的,有l(wèi)eft的,有時候,對于Select出來的結(jié)果集是什么樣子有點不是很清楚。Coding Horror上有一篇文章(實在不清楚為什么Coding Horror也被墻)通過 文氏圖 Venn diagrams 解釋了SQL的Join。我覺得清楚易懂,轉(zhuǎn)過來。

          假設(shè)我們有兩張表。

          • Table A 是左邊的表。
          • Table B 是右邊的表。

          其各有四條記錄,其中有兩條記錄是相同的,如下所示:

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

          下面讓我們來看看不同的Join會產(chǎn)生什么樣的結(jié)果。

          SELECT * FROM TableA
          INNER JOIN TableB
          ON TableA.name = TableB.name
          
          id  name       id   name
          --  ----       --   ----
          1   Pirate     2    Pirate
          3   Ninja      4    Ninja

          Inner join
          產(chǎn)生的結(jié)果集中,是A和B的交集。

          Venn diagram of SQL inner join
          SELECT * FROM TableA
          FULL OUTER JOIN TableB
          ON TableA.name = TableB.name
          
          id    name       id    name
          --    ----       --    ----
          1     Pirate     2     Pirate
          2     Monkey     null  null
          3     Ninja      4     Ninja
          4     Spaghetti  null  null
          null  null       1     Rutabaga
          null  null       3     Darth Vader

          Full outer join 產(chǎn)生A和B的并集。但是需要注意的是,對于沒有匹配的記錄,則會以null做為值。

          Venn diagram of SQL cartesian join
          SELECT * FROM TableA
          LEFT OUTER JOIN TableB
          ON TableA.name = TableB.name
          
          id  name       id    name
          --  ----       --    ----
          1   Pirate     2     Pirate
          2   Monkey     null  null
          3   Ninja      4     Ninja
          4   Spaghetti  null  null

          Left outer join 產(chǎn)生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。

          Venn diagram of SQL left join
          SELECT * FROM TableA
          LEFT OUTER JOIN TableB
          ON TableA.name = TableB.name
          WHERE TableB.id IS null 
          
          id  name       id     name
          --  ----       --     ----
          2   Monkey     null   null
          4   Spaghetti  null   null

          產(chǎn)生在A表中有而在B表中沒有的集合。

          join-left-outer.png
          SELECT * FROM TableA
          FULL OUTER JOIN TableB
          ON TableA.name = TableB.name
          WHERE TableA.id IS null
          OR TableB.id IS null
          
          id    name       id    name
          --    ----       --    ----
          2     Monkey     null  null
          4     Spaghetti  null  null
          null  null       1     Rutabaga
          null  null       3     Darth Vader

          產(chǎn)生A表和B表都沒有出現(xiàn)的數(shù)據(jù)集。

          join-outer.png

          還需要注冊的是我們還有一個是“交差集” cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數(shù)據(jù)進行一個N*M的組合,即笛卡爾積。表達式如下:

          SELECT * FROM TableA
          CROSS JOIN TableB

          這個笛卡爾乘積會產(chǎn)生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統(tǒng)都會產(chǎn)生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青海省| 芦山县| 兴海县| 延吉市| 垫江县| 荆州市| 根河市| 石嘴山市| 礼泉县| 固镇县| 陇川县| 南岸区| 班玛县| 永新县| 定远县| 英德市| 博客| 黎川县| 额尔古纳市| 昌宁县| 图们市| 漯河市| 宁乡县| 从江县| 沈阳市| 天气| 湟源县| 北京市| 玛多县| 佛山市| 顺平县| 甘洛县| 衡山县| 共和县| 苏州市| 肥城市| 禹州市| 白水县| 蒙城县| 河源市| 格尔木市|