而此篇將參照 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 BNATURAL JOIN的作用與INNER JOIN一樣,只是只能在兩張TABLE有一樣欄位名稱的狀況下才能使用。
- OUTER JOIN (LEFT & RIGHT)
圖二、LEFT OUTER |
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。
以上分享。
沒有留言:
張貼留言