【正文】
], 欄位二 [ASC, DESC] 若我們對這兩個欄位都選擇由小往大的話,那這個子句就會造成結(jié)果是依據(jù) 欄位一 由小往大排。若有好幾筆資料 欄位一 的值相等,那這幾筆資料就依據(jù) 欄位二 由小往大排。 舉例來說,若我們要依照 Sales 欄位的由大往小列出 Store_Information 表格中的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 San Francisco $300 an081999 Boston $700 Jan081999 我們就鍵入,SELECT store_name, Sales, Date FROM Store_Information ORDER BY Sales DESC結(jié)果: store_name Sales Date Los Angeles $1500 Jan051999 Boston $700 Jan081999 San Francisco $300 Jan081999 San Diego $250 Jan071999 在以上的例子中,我們用欄位名來指定排列順序的依據(jù)。除了欄位名外,我們也可以用欄位的順序 (依據(jù) SQL 句中的順序)。在 SELECT 后的第一個欄位為 1,第二個欄位為 2,以此類推。在上面這個例子中,我們用以下這句 SQL 可以達到完全一樣的效果: SELECT store_name, Sales, Date FROM Store_Information ORDER BY 2 DESC 函數(shù)既然數(shù)據(jù)庫中有許多資料都是已數(shù)字的型態(tài)存在,一個很重要的用途就是要能夠?qū)@些數(shù)字做一些運算,例如將它們總合起來,或是找出它們的平均值。SQL 有提供一些這一類的函數(shù)。它們是: AVG (平均) COUNT (計數(shù)) MAX (最大值) MIN (最小值) SUM (總合) 運用函數(shù)的語法是: SELECT 函數(shù)名(欄位名) FROM 表格名 舉例來說,若我們要由我們的范例表格中求出 Sales 欄位的總合, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT SUM(Sales) FROM Store_Information 結(jié)果: SUM(Sales) $2750 $2750 代表所有 Sales 欄位的總合: $1500 + $250 + $300 + $700. 除了函數(shù)的運用外,SQL 也可以做簡單的數(shù)學(xué)運算,例如加(+)和減()。對于文字類的資料,SQL 也有好幾個文字處理方面的函數(shù),例如文字相連 (concatenation),文字修整 (trim),以及子字符串 (substring)。不同的數(shù)據(jù)庫對這些函數(shù)有不同的語法,所以最好是參考您所用數(shù)據(jù)庫的信息,來確定在那個數(shù)據(jù)庫中,這些函數(shù)是如何被運用的。 COUNT在上一頁有提到, COUNT 是函數(shù)之一。由于它的使用廣泛,我們在這里特別提出來討論?;旧希?COUNT 讓我們能夠數(shù)出在表格中有多少筆資料被選出來。它的語法是: SELECT COUNT(欄位名) FROM 表格名 舉例來說,若我們要找出我們的范例表格中有幾筆 store_name 欄不是空白的資料時, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT COUNT(store_name) FROM Store_Information WHERE store_name is not NULL 結(jié)果: Count(store_name) 4 is not NULL 是 這個欄位不是空白 的意思。 COUNT 和 DISTINCT 經(jīng)常被合起來使用,目的是找出表格中有多少筆不同的資料 (至于這些資料實際上是什么并不重要)。舉例來說,如果我們要找出我們的表格中有多少個不同的 store_name,我們就鍵入, SELECT COUNT(DISTINCT store_name) FROM Store_Information 結(jié)果: Count(DISTINCT store_name) 3 GROUP BY我們現(xiàn)在回到函數(shù)上。記得我們用 SUM 這個指令來算出所有的 Sales (營業(yè)額)吧!如果我們的需求變成是要算出每一間店 (store_name) 的營業(yè)額 (sales),那怎么辦呢?在這個情況下,我們要做到兩件事:第一,我們對于 store_name 及 Sales 這兩個欄位都要選出。第二,我們需要確認所有的 sales 都要依照各個 store_name 來分開算。這個語法為: SELECT 欄位1, SUM(欄位2) FROM 表格名 GROUP BY 欄位1 在我們的范例上, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們就鍵入,SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 結(jié)果: store_name SUM(Sales) Los Angeles $1800 San Diego $250 Boston $700 當(dāng)我們選不只一個欄位,且其中至少一個欄位有包含函數(shù)的運用時,我們就需要用到 GROUP BY 這個指令。在這個情況下,我們需要確定我們有 GROUP BY 所有其他的欄位。換句話說,除了有包括函數(shù)的欄位外,我們都需要將其放在 GROUP BY 的子句中。 HAVING那我們?nèi)绾螌瘮?shù)產(chǎn)生的值來設(shè)定條件呢?舉例來說,我們可能只需要知道哪些店的營業(yè)額有超過 $1,500。在這個情況下,我們不能使用 WHERE 的指令。那要怎么辦呢?很幸運地,SQL 有提供一個 HAVING 的指令,而我們就可以用這個指令來達到這個目標(biāo)。 HAVING 子句通常是在一個 SQL 句子的最后。一個含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。HAVING 的語法如下: SELECT 欄位1, SUM(欄位2) FROM 表格名 GROUP BY 欄位1 HAVING (函數(shù)條件) 請讀者注意: 如果被 SELECT 的只有函數(shù)欄, 那就不需要 GROUP BY 子句。 在我們 Store_Information 表格這個例子中, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 若我們要找出 Sales 大于 $1,500 的 store_name,我們就鍵入,SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_nameHAVING SUM(sales) 1500 結(jié)果: store_name SUM(Sales) Los Angeles $1800 ALIAS接下來,我們討論 alias (別名) 在 SQL 上的用處。最常用到的別名有兩種:欄位別名及表格別名。 簡單地來說,欄位別名的目的是為了讓 SQL 產(chǎn)生的結(jié)果易讀。在之前的例子中,每當(dāng)我們有營業(yè)額總合時,欄位名都是 SUM(sales)。雖然在這個情況下沒有什么問題,可是如果這個欄位不是一個簡單的總合,而是一個復(fù)雜的計算,那欄位名就沒有這么易懂了。若我們用欄位別名的話,就可以確認結(jié)果中的欄位名是簡單易懂的。 第二種別名是表格別名。要給一個表格取一個別名,只要在 FROM 子句中的表格名后空一格,然后再列出要用的表格別名就可以了。這在我們要用 SQL 由數(shù)個不同的表格中獲取資料時是很方便的。這一點我們在之后談到連接 (join) 時會看到。 我們先來看一下欄位別名和表格別名的語法: SELECT 表格別名.欄位1 欄位別名 FROM 表格名 表格別名 基本上,這兩種別名都是放在它們要替代的物件后面,而它們中間由一個空白分開。我們繼續(xù)使用 Store_Information 這個表格來做例子: Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 我們用跟 SQL GROUP BY 那一頁一樣的例子。這里的不同處是我們加上了欄位別名以及表格別名: SELECT Store, SUM() Total Sales FROM Store_Information A1GROUP BY 結(jié)果: Store Total Sales Los Angeles $1800 San Diego $250 Boston $700 在結(jié)果中,資料本身沒有不同。不同的是欄位的標(biāo)題。這是運用欄位別名的結(jié)果。在第二個欄位上,原本我們的標(biāo)題是 Sum(Sales),而現(xiàn)在我們有一個很清楚的 Total Sales。很明顯地, Total Sales 能夠比 Sum(Sales) 更精確地闡述這個欄位的含意。用表格別名的好處在這里并沒有顯現(xiàn)出來,不過這在 下一頁就會很清楚了。 表格鏈接現(xiàn)在我們介紹連接(join)的概念。要了解連接,我們需要用到許多我們之前已介紹過的指令。我們先假設(shè)我們有以下的兩個表格, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan051999 San Diego $250 Jan071999 Los Angeles $300 Jan081999 Boston $700 Jan081999 Geography 表格 region_name store_name East Boston East New York West Los Angeles West San Diego 而我們要知道每一區(qū) (region_name) 的營業(yè)額 (sales)。 Geography 這個表格告訴我們每一區(qū)有哪些店,而 Store_Information 告訴我們每一個店的營業(yè)額。若我們要知道每一區(qū)的營業(yè)額,我們需要將這兩個不同表格中的資料串聯(lián)起來。當(dāng)我們仔細了解這兩個表格后,我們會發(fā)現(xiàn)它們可經(jīng)由一個相同的欄位,store_name,連接起來。我們先將 SQL 句列出,之后再討論每一個子句的意義: SELECT REGION, SUM() SALES FROM Geography A1, Store_Information A2 WHERE = GROUP BY 結(jié)果: REGION SALES East $700 West $2050 在第一行中,我們告訴 SQL 去選出兩個欄位:第一個欄位是 Geography 表格中的 region_name 欄位 (我們?nèi)×艘粋€別名叫做 REGION);第二個欄位是 Store_Information 表格中的 sales 欄位 (別名為 SALES)。請注意在這里我們有用到表格別名:Geography 表格的別名是 A1,Store_Information 表格的別名是 A2。若我們沒有用表格別名的話,第一行就會變成 SELECT REGION, SUM() SALES 很明顯地,這就復(fù)雜多了。在這里我們可以看到表格別名的功用:它能讓 SQL 句容易被了解,尤其