2010年9月15日 星期三

SQL (Join)

BASIC 概念

在我們介紹連接(join)的概念。要瞭解連接,我們需要用到許多我們之前已介紹過的指令。 我們先假設我們有以下的兩個表格,

Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

Geography 表格
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

而我們要知道每一區 (region_name) 的營業額 (sales)。 Geography 這個表格 告訴我們每一區有哪些店,而 Store_Information 告訴我們每一個店的營業額。 若我們要知道每一區的營業額,我們需要將這兩個不同表格中的資料串聯起來。當我們仔細瞭解這兩個 表格後,我們會發現它們可經由一個相同的欄位,store_name,連接起來。我們先將 SQL 句列出, 之後再討論每一個子句的意義:

SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name

結果:

REGIONSALES
East$700
West$2050

在第一行中,我們告訴 SQL 去選出兩個欄位:第一個欄位是 Geography 表格中的 region_name 欄位 (我們取了一個別名叫做 REGION);第二個欄位是 Store_Information 表格 中的 sales 欄位 (別名為 SALES)。請注意在這裡我們有用到表格別名:Geography 表格的 別名是 A1,Store_Information 表格的別名是 A2。若我們沒有用表格別名的話, 第一行就會變成

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES

很明顯地,這就複雜多了。在這裡我們可以看到表格別名的功用:它能讓 SQL 句容易被瞭解, 尤其是這個 SQL 句含蓋好幾個不同的表格時。

接下來我們看第三行,就是 WHERE 子句。 這是我們闡述連接條件的地方。在這裡,我們要確認 Geography 表格中 store_name 欄位的值與 Store_Information 表格中 store_name 欄位的值是相等的。 這個 WHERE 子句是一個連接的靈魂人物,因為它的角色是確定兩個 表格之間的連接是正確的。如果 WHERE 子句是錯誤的, 我們就極可能得到一個笛卡兒連接 (Cartesian join)。笛卡兒連接會造成我們得到所有兩個表格 每兩行之間所有可能的組合。在這個例子中,笛卡兒連接會讓我們得到 4 x 4 = 16 行的結果。


Outer Join

前我們看到的左連接 (left join),又稱內部連接 (inner join)。在這個情況下,要 兩個表格內都有同樣的值,那一筆資料才會被選出。那如果我們想要列出一個表格中每一筆的資料, 無論它的值在另一個表格中有沒有出現,那該怎麼辦呢?在這個時候,我們就需要用到 SQL OUTER JOIN (外部連接) 的指令。

外部連接的語法是依資料庫的不同而有所不同的。舉例來說,在 Oracle 上, 我們會在 WHERE 子句中要選出所有資料的那個表格之後加上一個 "(+)" 來代表說這個表格中的所有資料我們都要。

假設我們有以下的兩個表格:

Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999

Geography 表格
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

我們需要知道每一間店的營業額。如果我們用一個普通的連接,我們將會漏失掉 'New York'這個店,因為它並不存在於 Store_Information 這個表格。 所以,在這個情況下,我們需要用外部連接來串聯這兩個表格:

SELECT A1.store_name, SUM(A2.Sales) SALES
FROM Georgraphy A1, Store_Information A2
WHERE A1.store_name = A2.store_name
(+)
GROUP BY A1.store_name

我們在這裡是使用了 Oracle 的外部連接語法。

結果:

store_nameSALES
Boston$700
New York
Los Angeles$1800
San Diego$250

請注意: 當第二個表格沒有相對的資料時, SQL 會傳回 NULL 值。在這一個例子中, 'New York' 並不存在於 Store_Information 表格,所以它的 "SALES" 欄位是 NULL.

沒有留言:

張貼留言