歡迎您光臨本站 註冊首頁

關於sql joins的圖形解說 .

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

關於sql joins的圖形解說 .

關於sql joins的圖形解說 .






原文:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

翻譯:

我喜歡這種查詢方式,現在讓我們來看看它是如何工作的。假設我們有如下的兩張表。表A在左邊,表B在右邊。我們將用下面的四條記錄進行互相的組裝查詢。

view plaincopyprint?01.id name       id  name  
02.-- ----       --  ----  
03.1  Pirate     1   Rutabaga  
04.2  Monkey     2   Pirate  
05.
3  Ninja      3   Darth Vader  
06.4  Spaghetti  4   Ninja  
id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja 讓我們用不同的方式根據name這個欄位join這些表進行查詢,來看看是否我們能得出一個能夠和這些漂亮的圖解相吻合的結論。



view plaincopyprint?01.SELECT * FROM TableA  02.INNER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id  name       id   name  06.--  ----       --   ----   07.1   Pirate     2    Pirate  08.3   Ninja      4    Ninja  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都相同的部分


  
view plaincopyprint?01.SELECT * FROM TableA  02.FULL OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id    name       id    name  06.--    ----       --    ----   07.1     Pirate     2     Pirate  08.2     Monkey     null  null  09.3     Ninja      4     Ninja  10.4     Spaghetti  null  null  11.null  null       1     Rutabaga         12.null  null       3     Darth Vader  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來填充.
  

view plaincopyprint?01.SELECT * FROM TableA  02.LEFT OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id  name       id    name  06.--  ----       --    ----   07.1   Pirate     2     Pirate  08.2   Monkey     null  null  09.3   Ninja      4     Ninja  10.4   Spaghetti  null  null  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來填充。

  
view plaincopyprint?01.SELECT * FROM TableA  02.LEFT OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.WHERE TableB.id IS null  05.  06.id  name       id     name  07.--  ----       --     ----   08.2   Monkey     null   null  09.4   Spaghetti  null   null  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

Left outer join produces a complete set of records from Table A, with the matching records    (where available) in Table B. If there is no match, the right side will contain null.
  
view plaincopyprint?01.SELECT * FROM TableA  02.FULL OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.WHERE TableA.id IS null   05.OR TableB.id IS null  06.  07.id    name       id    name  08.--    ----       --    ----   09.2     Monkey     null  null  10.4     Spaghetti  null  null  11.null  null       1     Rutabaga  12.null  null       3     Darth Vader  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

  Full outer join  To produce the set of records unique to Table A and Table B, we perform the same full outer join,    thenexclude the records we don't want from both sides via a where clause.
  



         還有一個cross join查詢,這個就不用圖解了: view plaincopyprint?01.SELECT * FROM TableA  02.CROSS JOIN TableB  SELECT * FROM TableA
CROSS JOIN TableB這種連接查詢是把每個記錄都查出來的並且疊加匹配,結果12行,很多原始數據集合。如果你做這種匹配查詢,你會發現為什麼對於查詢大數據時是一種危險的連接了。

《解決方案》

謝謝分享

[火星人 ] 關於sql joins的圖形解說 .已經有684次圍觀

http://coctec.com/docs/service/show-post-923.html