2014年8月24日 星期日

SQL裡頭的各種JOIN(NATURAL JOIN、OUTER JOIN、INNER JOIN)

Join 這一詞很容易在關連式資料庫運用到,畢竟這是找出TABLE之間,很普遍的用法!
而此篇將參照 Code Project - Visual Representation of SQL Joins 和 資料庫的核心理論與實務 對於JOIN的解釋、運用圖解來進行關念釐清。


全文假設A、B兩張Table,且皆有keyNo這一欄位。

  • Inner Join(Join)
圖一、INNER JOIN
--INNER JOIN
SELECT keyNo
FROM A INNER JOIN B ON A.keyNo = B.keyNo

--JOIN
SELECT keyNo
FROM A JOIN B ON A.keyNo = B.keyNo
上述兩段Code作用皆一樣,故我們可以發現 JOIN 跟 INNER JOIN是ㄧ樣,只是INNER JOIN表達更加完整,而簡單來說INNER JOIN就是只抓取A、B兩張TABLE相同部分。

  • NATRUAL JOIN
--NATRAL JOIN
SELECT keyNo
FROM A NATURAL JOIN B 
NATURAL JOIN的作用與INNER JOIN一樣,只是只能在兩張TABLE有一樣欄位名稱的狀況下才能使用。

  • OUTER JOIN (LEFT & RIGHT)
圖二、LEFT OUTER
在解釋OUTER JOIN之前我們先跳脫本文一開始假設,加入以下Member、Browse兩張TABLE,
Member (mId,name) | Browse (mId,browseTime,pNo),並且來回答此問題:Q1:列出每一位會員的編號、姓名和2005年所瀏覽的商品之商品編號 (如果有的話)。
--第一種方式
SELECT M.mId,name,pNo
FROM Member AS M LEFT OUTER JOIN Browse AS B
ON (M.mId = B.mId AND to_char(browseTime,'yyyy')='2005')

--第二種方式
SELECT M.mId,name,pNo
FROM Member AS M LEFT OUTER JOIN Browse AS B
ON M.mId = B.mId 
WHERE to_char(browseTime,'yyyy')='2005'
讓我們先以圖二來解釋OUTER JOIN,簡單的來說就是不管是否JOIN條件,一定要包含A部分。

所以我們回到Q1問題,我們可以看到列出每一位會員這個關鍵字,所以不管是否有瀏覽資料都必須SELECT出會員的編號及姓名,這就是OUTER JOIN使用之時機。

在讓我們來比較第一種和第二種方式,第二種方式在JOIN完後,以WHERE取出符合2005年的瀏覽資料,但由於並非每一個會員都有2005年資料,故這樣的做法使OUTER JOIN失去了作用,因為最後取出的並不是每一位會員

最後Q1的範例僅是LEFT OUTER JOIN的運用,相同地我們也可以用相同概念去做一個RIGHT OUTER JOIN。

以上分享。

沒有留言:

張貼留言