畫圖解釋 SQL join 語句

來源:互聯網
上載者:User

畫圖解釋 SQL join 語句

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

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

  1. id name id name
  2. ------------
  3. 1Pirate1Rutabaga
  4. 2Monkey2Pirate
  5. 3Ninja3DarthVader
  6. 4Spaghetti4Ninja

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

內聯合(inner join)
  1. SELECT * FROM TableA
  2. INNER JOIN TableB
  3. ON TableA.name =TableB.name
  4. id name id name
  5. ------------
  6. 1Pirate2Pirate
  7. 3Ninja4Ninja

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

inner join

全外聯合(full outer join)
  1. SELECT * FROM TableA
  2. FULL OUTER JOIN TableB
  3. ON TableA.name =TableB.name
  4. id name id name
  5. ------------
  6. 1Pirate2Pirate
  7. 2Monkeynullnull
  8. 3Ninja4Ninja
  9. 4Spaghettinullnull
  10. nullnull1Rutabaga
  11. nullnull3DarthVader

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

Full outer join

左外聯合(left outer join)
  1. SELECT * FROM TableA
  2. LEFT OUTER JOIN TableB
  3. ON TableA.name =TableB.name
  4. id name id name
  5. ------------
  6. 1Pirate2Pirate
  7. 2Monkeynullnull
  8. 3Ninja4Ninja
  9. 4Spaghettinullnull

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

Left outer join

左外聯合,然後用where語句排除一邊我們不想要的記錄
  1. SELECT * FROM TableA
  2. LEFT OUTER JOIN TableB
  3. ON TableA.name =TableB.name
  4. WHERE TableB.id IS null
  5. id name id name
  6. ------------
  7. 2Monkeynullnull
  8. 4Spaghettinullnull

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

WHERE TableB.id IS nul

全外聯合,然後用where語句排除兩邊都不想要的記錄
  1. SELECT * FROM TableA
  2. FULL OUTER JOIN TableB
  3. ON TableA.name =TableB.name
  4. WHERE TableA.id IS null
  5. OR TableB.id IS null
  6. id name id name
  7. ------------
  8. 2Monkeynullnull
  9. 4Spaghettinullnull
  10. nullnull1Rutabaga
  11. nullnull3DarthVader

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

 

WHERE TableA.id IS null

交叉聯合(cross join)

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

  1. SELECT * FROM TableA
  2. CROSS JOIN TableB

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

總結圖

由 Moffatt 在 2008 年製作(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。

SQL Joins

本文永久更新連結地址:

相關文章

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.