SQLite權威指南-CLP(command line program) [ 9 ]:多表連接(join)的應用
資料來源:SQLite權威指南 P028
多表連接
連接(join)是SELECT 命令的第一個操作,它產生初始的資訊,供語句的其他部分過濾和處
理。連接的結果是一個合成的關係(或表),它是SELECT 後繼操作的輸入。
也許從一個例子開始是最簡單的。
sqlite> SELECT foods.name,food_types.name FROM foods, food_types WHERE foods.type_id=food_types.id LIMIT 10;
-------------
name name
Bagels Bakery
Bagels, raisin Bakery
Bavarian Cream Pie Bakery
Bear Claws Bakery
Black and White cookies Bakery
Bread (with nuts) Bakery
Butterfingers Bakery
Carrot Cake Bakery
Chips Ahoy Cookies Bakery
Chocolate Bobka Bakery
網路範例:http://www.1keydata.com/tw/sql/sqljoins.html
現在我們介紹連接 (join) 的概念。要瞭解連接,我們需要用到許多我們之前已介紹過的指令。我們先假設我們有以下的兩個表格,
Store_Information 表格
Store_Name | Sales | Txn_Date |
Los Angeles | 1500 | 05-Jan-1999 |
San Diego | 250 | 07-Jan-1999 |
Los Angeles | 300 | 08-Jan-1999 |
Boston | 700 | 08-Jan-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 句列出,之後再討論每一個子句的意義:
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;
結果:
REGION | SALES |
East | 700 |
West | 2050 |
在第一行中,我們告訴 SQL 去選出兩個欄位:第一個欄位是 Geography 表格中的 Region_Name 欄位 (我們取了一個別名叫做 REGION);第二個欄位是 Store_Information 表格中的 Sales 欄位 (別名為 SALES)。請注意在這裡我們有用到表格別名:Geography 表格的別名是 A1,Store_Information 表格的別名是 A2。若我們沒有用表格別名的話,第一行就會變成
很明顯地,這就複雜多了。在這裡我們可以看到表格別名的功用:它能讓 SQL 句容易被瞭解,尤其是這個 SQL 句含蓋好幾個不同的表格時。
接下來我們看第三行,就是 WHERE 子句。這是我們闡述連接條件的地方。在這裡,我們要確認 Geography表格中 Store_Name 欄位的值與 Store_Information 表格中 Store_Name 欄位的值是相等的。這個 WHERE 子句是一個連接的靈魂人物,因為它的角色是確定兩個表格之間的連接是正確的。如果 WHERE 子句是錯誤的,我們就極可能得到一個笛卡兒連接 (Cartesian join)。笛卡兒連接會造成我們得到所有兩個表格每兩行之間所有可能的組合。在這個例子中,笛卡兒連接會讓我們得到 4 x 4 = 16 行的結果。
沒有留言:
張貼留言