轉:畫圖解釋 SQL join 語句

來源:互聯網
上載者:User

標籤:style   blog   http   ar   color   os   sp   strong   on   

畫圖解釋 SQL join 語句

我認為 Ligaya Turmelle 的關於SQL聯合(join)語句的文章對於新手開發人員來說是份很好的材料。SQL 聯合語句好像是基於集合的,用韋恩圖來解釋咋一看是很自然而然的。不過正如在她的文章的回複中所說的,在測試中我發現韋恩圖並不是十分的匹配SQL聯合文法。

不過我還是喜歡這個觀點,所以我們來看看能不能用上韋恩圖。假設我們有下面兩張表。表A在左邊,表B在右邊。我們給它們各四條記錄。

123456 id name       id  name-- ----       --  ----1  Pirate     1   Rutabaga2  Monkey     2   Pirate3  Ninja      3   Darth Vader4  Spaghetti  4   Ninja

 

我們用過name欄位用幾種不同方式把這些表聯合起來,看能否得到和那些漂亮的韋恩圖在概念上的匹配。

 

12345678 SELECT * FROM TableAINNER JOIN TableBON TableA.name = TableB.name id  name       id   name--  ----       --   ----1   Pirate     2    Pirate3   Ninja      4    Ninja

內聯合(inner join)只產生同時匹配表A和表B的記錄集。(如)

——————————————————————————-

123456789101112 SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.name id    name       id    name--    ----       --    ----1     Pirate     2     Pirate2     Monkey     null  null3     Ninja      4     Ninja4     Spaghetti  null  nullnull  null       1     Rutabaga       null  null       3     Darth Vader

全外聯合(full outer join)產生表A和表B裡的記錄全集,包括兩邊都匹配的記錄。如果有一邊沒有匹配的,缺失的這一邊為null。(如)

——————————————————————————-

12345678910 SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.name id  name       id    name--  ----       --    ----1   Pirate     2     Pirate2   Monkey     null  null3   Ninja      4     Ninja4   Spaghetti  null  null

左外聯合(left outer join)產生表A的所有記錄,包括在表B裡匹配的記錄。如果沒有匹配的,右邊將是null。(如)

——————————————————————————-

123456789 SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableB.id IS null id  name       id     name--  ----       --     ----2   Monkey     null   null4   Spaghetti  null   null

為了產生只在表A裡而不在表B裡的記錄集,我們用同樣的左外聯合,然後用where語句排除我們不想要的記錄。(如)

——————————————————————————-

123456789101112 SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableA.id IS null OR TableB.id IS null id    name       id    name--    ----       --    ----2     Monkey     null  null4     Spaghetti  null  nullnull  null       1     Rutabaganull  null       3     Darth Vader

為了產生對於表A和表B唯一的記錄集,我們用同樣的全外聯合,然後用where語句排除兩邊都不想要的記錄。(如)

 

———————————————————–

 

還有一種笛卡爾積或者交叉聯合(cross join),據我所知不能用韋恩圖表示:

12 SELECT * FROM TableACROSS JOIN TableB

 

這個把“所有”聯結到“所有”,產生4乘4=16行,遠多於原始的集合。如果你學過數學,你便知道為什麼這個聯合遇上大型的表很危險。

 

【2013-06-17 更新】由 Moffatt 在 2008 年製作(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。

轉:畫圖解釋 SQL join 語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.