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