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

          導航

          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          jion介紹

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

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

          假設我們有兩張表。

          • 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會產生什么樣的結果。

          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
          產生的結果集中,是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 產生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 產生表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

          產生在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

          產生A表和B表都沒有出現的數據集。

          join-outer.png

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

          SELECT * FROM TableA
          CROSS JOIN TableB

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


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


          網站導航:
           
          主站蜘蛛池模板: 宜丰县| 什邡市| 八宿县| 天镇县| 宝山区| 读书| 蕉岭县| 文登市| 邢台县| 防城港市| 赤峰市| 沛县| 定南县| 合肥市| 大余县| 溧阳市| 朝阳市| 资溪县| 龙游县| 大冶市| 莲花县| 高清| 沙雅县| 墨脱县| 柳江县| 铁岭市| 高陵县| 镇赉县| 宜良县| 余江县| 荣昌县| 连城县| 桐梓县| 清水河县| 饶平县| 沐川县| 华亭县| 原平市| 怀宁县| 武隆县| 泸定县|