SQL語(yǔ)句經(jīng)典教程_百度文庫(kù)_第1頁(yè)
SQL語(yǔ)句經(jīng)典教程_百度文庫(kù)_第2頁(yè)
SQL語(yǔ)句經(jīng)典教程_百度文庫(kù)_第3頁(yè)
SQL語(yǔ)句經(jīng)典教程_百度文庫(kù)_第4頁(yè)
SQL語(yǔ)句經(jīng)典教程_百度文庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、SQL語(yǔ)句經(jīng)典教程SQL常用指令包含以下幾個(gè)部分: SQL 指令: SQL 如何被用來(lái)儲(chǔ)存、讀取、以及處理數(shù)據(jù)庫(kù)之中的資料。 表格處理: SQL 如何被用來(lái)處理數(shù)據(jù)庫(kù)中的表格。 進(jìn)階 SQL: 介紹 SQL 進(jìn)階概念,以及如何用 SQL 來(lái)執(zhí)行一些較復(fù)雜的運(yùn)算。 SQL 語(yǔ)法: 這一頁(yè)列出所有在這個(gè)教材中被提到的 SQL 語(yǔ)法。 對(duì)于每一個(gè)指令,我們將會(huì)先列出及解釋這個(gè)指令的語(yǔ)法,然后用一個(gè)例子來(lái)讓讀者了解這個(gè)指令是如何被運(yùn)用的。當(dāng)您讀完了這個(gè)網(wǎng)站的所有教材后,您將對(duì) SQL 的語(yǔ)法會(huì)有一個(gè)大致上的了解。另外,您將能夠正確地運(yùn)用 SQL 來(lái)由數(shù)據(jù)庫(kù)中獲取信息。筆者本身的經(jīng)驗(yàn)是,雖然要對(duì) SQL

2、 有很透徹的了解并不是一朝一夕可以完成的,可是要對(duì) SQL 有個(gè)基本的了解并不難。希望在看完這個(gè)網(wǎng)站后,您也會(huì)有同樣的想法。 SQL指令SELECT是用來(lái)做什么的呢?一個(gè)最常用的方式是將資料從數(shù)據(jù)庫(kù)中的表格內(nèi)選出。從這一句回答中,我們馬上可以看到兩個(gè)關(guān)鍵字: 從 (FROM 數(shù)據(jù)庫(kù)中的表格內(nèi)選出 (SELECT。(表格是一個(gè)數(shù)據(jù)庫(kù)內(nèi)的結(jié)構(gòu),它的目的是儲(chǔ)存資料。在表格處理這一部分中,我們會(huì)提到如何使用 SQL 來(lái)設(shè)定表格。 我們由這里可以看到最基本的 SQL 架構(gòu): SELECT "欄位名" FROM "表格名" 我們用以下的例子來(lái)看看實(shí)際上是怎么用的。假

3、設(shè)我們有以下這個(gè)表格: 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 若要選出所有的店名 (store_Name,我們就打入: SELECT store_name FROM Store_Information 結(jié)果:store_nameLos AngelesSan DiegoLos AngelesBoston我們一次可以讀取好幾個(gè)欄位,也可以同時(shí)由好幾個(gè)表格中選資料。 DISTI

4、NCTSELECT 指令讓我們能夠讀取表格中一個(gè)或數(shù)個(gè)欄位的所有資料。這將把所有的資料都抓出,無(wú)論資料值有無(wú)重復(fù)。在資料處理中,我們會(huì)經(jīng)常碰到需要找出表格內(nèi)的不同資料值的情況。換句話(huà)說(shuō),我們需要知道這個(gè)表格/欄位內(nèi)有哪些不同的值,而每個(gè)值出現(xiàn)的次數(shù)并不重要。這要如何達(dá)成呢?在 SQL 中,這是很容易做到的。我們只要在 SELECT 后加上一個(gè) DISTINCT 就可以了。DISTINCT 的語(yǔ)法如下: SELECT DISTINCT "欄位名" FROM "表格名" 舉例來(lái)說(shuō),若要在以下的表格,Store_Information,找出所有不同的店名時(shí),

5、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 我們就鍵入,SELECT DISTINCT store_name FROM Store_Information結(jié)果: store_name Los Angeles San Diego Boston WHERE我們并不一定每一次都要將表格內(nèi)的資料都完全抓出。在許多時(shí)候,我們會(huì)需要選擇性地抓資料。就

6、我們的例子來(lái)說(shuō),我們可能只要抓出營(yíng)業(yè)額超過(guò) $1,000 的資料。要做到這一點(diǎn),我們就需要用到 WHERE 這個(gè)指令。這個(gè)指令的語(yǔ)法如下:SELECT "欄位名" FROM "表格名" WHERE "條件" 若我們要由以下的表格抓出營(yíng)業(yè)額超過(guò) $1,000 的資料, 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 $

7、700 Jan-08-1999 我們就鍵入,SELECT store_name FROM Store_Information WHERE Sales > 1000 結(jié)果: store_name Los Angeles AND OR在上一頁(yè)中,我們看到 WHERE 指令可以被用來(lái)由表格中有條件地選取資料。 這個(gè)條件可能是簡(jiǎn)單的 (像上一頁(yè)的例子,也可能是復(fù)雜的。復(fù)雜條件是由二或多個(gè)簡(jiǎn)單條件透過(guò) AND 或是 OR 的連接而成。一個(gè) SQL 語(yǔ)句中可以有無(wú)限多個(gè)簡(jiǎn)單條件的存在。 復(fù)雜條件的語(yǔ)法如下: SELECT "欄位名" FROM "表格名" WH

8、ERE "簡(jiǎn)單條件" AND|OR "簡(jiǎn)單條件"+ + 代表之內(nèi)的情況會(huì)發(fā)生一或多次。在這里的意思就是 AND 加簡(jiǎn)單條件及 OR 加簡(jiǎn)單條件的情況可以發(fā)生一或多次。另外,我們可以用 ( 來(lái)代表?xiàng)l件的先后次序。 舉例來(lái)說(shuō),我們?nèi)粢?Store_Information 表格中選出所有 Sales 高于 $1,000 或是 Sales 在 $500 及 $275 之間的資料的話(huà), Store_Information 表格store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Ja

9、n-07-1999 San Francisco $300 Jan-08-1999 Boston $700 Jan-08-1999我們就鍵入,SELECT store_name FROM Store_Information WHERE Sales > 1000 OR (Sales < 500 AND Sales > 275 結(jié)果: store_name Los Angeles San Francisco IN在 SQL 中,在兩個(gè)情況下會(huì)用到 IN 這個(gè)指令;這一頁(yè)將介紹其中之一:與 WHERE 有關(guān)的那一個(gè)情況。在這個(gè)用法下,我們事先已知道至少一個(gè)我們需要的值,而我們將這些知

10、道的值都放入 IN 這個(gè)子句。 IN 指令的語(yǔ)法為下: SELECT "欄位名" FROM "表格名" WHERE "欄位名" IN ('值一', '值二', . 在括號(hào)內(nèi)可以有一或多個(gè)值,而不同值之間由逗點(diǎn)分開(kāi)。值可以是數(shù)目或是文字。若在括號(hào)內(nèi)只有一個(gè)值,那這個(gè)子句就等于 WHERE "欄位名" = '值一' 舉例來(lái)說(shuō),若我們要在 Store_Information 表格中找出所有含蓋 Los Angeles 或 San Diego 的資料, Store_Infor

11、mation 表格store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 San Francisco $300 Jan-08-1999 Boston $700 Jan-08-1999 我們就鍵入,SELECT * FROM Store_Information WHERE store_name IN ('Los Angeles', 'San Diego' 結(jié)果: store_name Sales Date Los Angeles $1500 Jan-05-1999

12、 San Diego $250 Jan-07-1999 BETWEENIN 這個(gè)指令可以讓我們依照一或數(shù)個(gè)不連續(xù) (discrete 的值的限制之內(nèi)抓出資料庫(kù)中的值,而 BETWEEN 則是讓我們可以運(yùn)用一個(gè)范圍 (range 內(nèi)抓出資料庫(kù)中的值。BETWEEN 這個(gè)子句的語(yǔ)法如下: SELECT "欄位名" FROM "表格名" WHERE "欄位名" BETWEEN '值一' AND '值二' 這將選出欄位值包含在值一及值二之間的每一筆資料。 舉例來(lái)說(shuō),若我們要由 Store_Information

13、 表格中找出所有介于 January 6, 1999 及 January 10, 1999 中的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 San Francisco $300 Jan-08-1999 Boston $700 Jan-08-1999 我們就鍵入,SELECT * FROM Store_Information WHERE Date BETWEEN 'Jan-06-1999' AND 'Jan-10

14、-1999'請(qǐng)讀者注意:在不同的數(shù)據(jù)庫(kù)中,日期的儲(chǔ)存法可能會(huì)有所不同。在這里我們選擇了其中一種儲(chǔ)存法。 結(jié)果: store_name Sales Date San Diego $250 Jan-07-1999 San Francisco $300 Jan-08-1999 Boston $700 Jan-08-1999 LIKELIKE 是另一個(gè)在 WHERE 子句中會(huì)用到的指令?;旧?, LIKE 能讓我們依據(jù)一個(gè)模式 (pattern 來(lái)找出我們要的資料。相對(duì)來(lái)說(shuō),在運(yùn)用 IN 的時(shí)候,我們完全地知道我們需要的條件;在運(yùn)用 BETWEEN 的時(shí)候,我們則是列出一個(gè)范圍。 LIKE 的

15、語(yǔ)法如下: SELECT "欄位名" FROM "表格名" WHERE "欄位名" LIKE 模式 模式 經(jīng)常包括野卡 (wildcard. 以下是幾個(gè)例子: 'A_Z': 所有以 'A' 起頭,另一個(gè)任何值的字原,且以 'Z' 為結(jié)尾的字符串。 'ABZ' 和 'A2Z' 都符合這一個(gè)模式,而 'AKKZ' 并不符合 (因?yàn)樵?A 和 Z 之間有兩個(gè)字原,而不是一個(gè)字原。 'ABC%': 所有以 'ABC'

16、 起頭的字符串。舉例來(lái)說(shuō),'ABCD' 和 'ABCABC' 都符合這個(gè)模式。 '%XYZ': 所有以 'XYZ' 結(jié)尾的字符串。舉例來(lái)說(shuō),'WXYZ' 和 'ZZXYZ' 都符合這個(gè)模式。 '%AN%': 所有含有 'AN'這個(gè)模式的字符串。舉例來(lái)說(shuō), 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合這個(gè)模式。 我們將以上最后一個(gè)例子用在我們的 Store_Information 表格上: Store_Infor

17、mation 表格store_name Sales Date LOS ANGELES $1500 Jan-05-1999 SAN DIEGO $250 Jan-07-1999 SAN FRANCISCO $300 Jan-08-1999 BOSTON $700 Jan-08-1999 我們就鍵入,SELECT * FROM Store_Information WHERE store_name LIKE '%AN%'結(jié)果: store_name Sales Date LOS ANGELES $1500 Jan-05-1999 SAN FRANCISCO $300 Jan-08-1

18、999 SAN DIEGO $250 Jan-07-1999 ORDER BY到目前為止,我們已學(xué)到如何藉由 SELECT 及 WHERE 這兩個(gè)指令將資料由表格中抓出。不過(guò)我們尚未提到這些資料要如何排列。這其實(shí)是一個(gè)很重要的問(wèn)題。事實(shí)上,我們經(jīng)常需要能夠?qū)⒆コ龅馁Y料做一個(gè)有系統(tǒng)的顯示。這可能是由小往大 (ascending 或是由大往小(descending。在這種情況下,我們就可以運(yùn)用 ORDER BY 這個(gè)指令來(lái)達(dá)到我們的目的。 ORDER BY 的語(yǔ)法如下: SELECT "欄位名" FROM "表格名" WHERE "條件"

19、ORDER BY "欄位名" ASC, DESC 代表 WHERE 子句不是一定需要的。不過(guò),如果 WHERE 子句存在的話(huà),它是在 ORDER BY 子句之前。 ASC 代表結(jié)果會(huì)以由小往大的順序列出,而 DESC 代表結(jié)果會(huì)以由大往小的順序列出。如果兩者皆沒(méi)有被寫(xiě)出的話(huà),那我們就會(huì)用 ASC。 我們可以照好幾個(gè)不同的欄位來(lái)排順序。在這個(gè)情況下, ORDER BY 子句的語(yǔ)法如下(假設(shè)有兩個(gè)欄位: ORDER BY "欄位一" ASC, DESC, "欄位二" ASC, DESC 若我們對(duì)這兩個(gè)欄位都選擇由小往大的話(huà),那這個(gè)子句就會(huì)

20、造成結(jié)果是依據(jù) "欄位一" 由小往大排。若有好幾筆資料 "欄位一" 的值相等,那這幾筆資料就依據(jù) "欄位二" 由小往大排。 舉例來(lái)說(shuō),若我們要依照 Sales 欄位的由大往小列出 Store_Information 表格中的資料, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 San Francisco $300 an-08-1999 Boston $700 Jan-08-1999 我

21、們就鍵入,SELECT store_name, Sales, Date FROM Store_Information ORDER BY Sales DESC結(jié)果: store_name Sales Date Los Angeles $1500 Jan-05-1999 Boston $700 Jan-08-1999 San Francisco $300 Jan-08-1999 San Diego $250 Jan-07-1999 在以上的例子中,我們用欄位名來(lái)指定排列順序的依據(jù)。除了欄位名外,我們也可以用欄位的順序 (依據(jù) SQL 句中的順序。在 SELECT 后的第一個(gè)欄位為 1,第二個(gè)欄位為

22、 2,以此類(lèi)推。在上面這個(gè)例子中,我們用以下這句 SQL 可以達(dá)到完全一樣的效果: SELECT store_name, Sales, Date FROM Store_Information ORDER BY 2 DESC 函數(shù)既然數(shù)據(jù)庫(kù)中有許多資料都是已數(shù)字的型態(tài)存在,一個(gè)很重要的用途就是要能夠?qū)@些數(shù)字做一些運(yùn)算,例如將它們總合起來(lái),或是找出它們的平均值。SQL 有提供一些這一類(lèi)的函數(shù)。它們是: AVG (平均 COUNT (計(jì)數(shù) MAX (最大值 MIN (最小值 SUM (總合 運(yùn)用函數(shù)的語(yǔ)法是: SELECT "函數(shù)名"("欄位名" FROM

23、"表格名" 舉例來(lái)說(shuō),若我們要由我們的范例表格中求出 Sales 欄位的總合, 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 我們就鍵入,SELECT SUM(Sales FROM Store_Information 結(jié)果: SUM(Sales $2750 $2750 代表所有 Sales 欄位的總合: $1500 +

24、$250 + $300 + $700. 除了函數(shù)的運(yùn)用外,SQL 也可以做簡(jiǎn)單的數(shù)學(xué)運(yùn)算,例如加(+和減(-。對(duì)于文字類(lèi)的資料,SQL 也有好幾個(gè)文字處理方面的函數(shù),例如文字相連 (concatenation,文字修整 (trim,以及子字符串 (substring。不同的數(shù)據(jù)庫(kù)對(duì)這些函數(shù)有不同的語(yǔ)法,所以最好是參考您所用數(shù)據(jù)庫(kù)的信息,來(lái)確定在那個(gè)數(shù)據(jù)庫(kù)中,這些函數(shù)是如何被運(yùn)用的。 COUNT在上一頁(yè)有提到, COUNT 是函數(shù)之一。由于它的使用廣泛,我們?cè)谶@里特別提出來(lái)討論?;旧?, COUNT 讓我們能夠數(shù)出在表格中有多少筆資料被選出來(lái)。它的語(yǔ)法是: SELECT COUNT("

25、欄位名" FROM "表格名" 舉例來(lái)說(shuō),若我們要找出我們的范例表格中有幾筆 store_name 欄不是空白的資料時(shí), 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 我們就鍵入,SELECT COUNT(store_name FROM Store_Information WHERE store_name is

26、 not NULL 結(jié)果: Count(store_name 4 "is not NULL" 是 "這個(gè)欄位不是空白" 的意思。 COUNT 和 DISTINCT 經(jīng)常被合起來(lái)使用,目的是找出表格中有多少筆不同的資料 (至于這些資料實(shí)際上是什么并不重要。舉例來(lái)說(shuō),如果我們要找出我們的表格中有多少個(gè)不同的 store_name,我們就鍵入, SELECT COUNT(DISTINCT store_name FROM Store_Information 結(jié)果: Count(DISTINCT store_name 3 GROUP BY我們現(xiàn)在回到函數(shù)上。記得我

27、們用 SUM 這個(gè)指令來(lái)算出所有的 Sales (營(yíng)業(yè)額吧!如果我們的需求變成是要算出每一間店 (store_name 的營(yíng)業(yè)額 (sales,那怎么辦呢?在這個(gè)情況下,我們要做到兩件事:第一,我們對(duì)于 store_name 及 Sales 這兩個(gè)欄位都要選出。第二,我們需要確認(rèn)所有的 sales 都要依照各個(gè) store_name 來(lái)分開(kāi)算。這個(gè)語(yǔ)法為: SELECT "欄位1", SUM("欄位2" FROM "表格名" GROUP BY "欄位1" 在我們的范例上, Store_Information 表格s

28、tore_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 我們就鍵入,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è)欄位有

29、包含函數(shù)的運(yùn)用時(shí),我們就需要用到 GROUP BY 這個(gè)指令。在這個(gè)情況下,我們需要確定我們有 GROUP BY 所有其他的欄位。換句話(huà)說(shuō),除了有包括函數(shù)的欄位外,我們都需要將其放在 GROUP BY 的子句中。 HAVING那我們?nèi)绾螌?duì)函數(shù)產(chǎn)生的值來(lái)設(shè)定條件呢?舉例來(lái)說(shuō),我們可能只需要知道哪些店的營(yíng)業(yè)額有超過(guò) $1,500。在這個(gè)情況下,我們不能使用 WHERE 的指令。那要怎么辦呢?很幸運(yùn)地,SQL 有提供一個(gè) HAVING 的指令,而我們就可以用這個(gè)指令來(lái)達(dá)到這個(gè)目標(biāo)。 HAVING 子句通常是在一個(gè) SQL 句子的最后。一個(gè)含有 HAVING 子句的 SQL 并不一定要包含 GROUP

30、 BY 子句。HAVING 的語(yǔ)法如下: 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 Jan-05-1999 San Diego $250 Jan-07-1999 L

31、os Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 若我們要找出 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接下來(lái),我們討論 alias (別名 在 SQL 上的用處。最常用到的別名有兩種:欄位別名及表格別名。 簡(jiǎn)單地來(lái)說(shuō),欄位

32、別名的目的是為了讓 SQL 產(chǎn)生的結(jié)果易讀。在之前的例子中,每當(dāng)我們有營(yíng)業(yè)額總合時(shí),欄位名都是 SUM(sales。雖然在這個(gè)情況下沒(méi)有什么問(wèn)題,可是如果這個(gè)欄位不是一個(gè)簡(jiǎn)單的總合,而是一個(gè)復(fù)雜的計(jì)算,那欄位名就沒(méi)有這么易懂了。若我們用欄位別名的話(huà),就可以確認(rèn)結(jié)果中的欄位名是簡(jiǎn)單易懂的。 第二種別名是表格別名。要給一個(gè)表格取一個(gè)別名,只要在 FROM 子句中的表格名后空一格,然后再列出要用的表格別名就可以了。這在我們要用 SQL 由數(shù)個(gè)不同的表格中獲取資料時(shí)是很方便的。這一點(diǎn)我們?cè)谥笳劦竭B接 (join 時(shí)會(huì)看到。 我們先來(lái)看一下欄位別名和表格別名的語(yǔ)法: SELECT "表格別名

33、"."欄位1" "欄位別名" FROM "表格名" "表格別名" 基本上,這兩種別名都是放在它們要替代的物件后面,而它們中間由一個(gè)空白分開(kāi)。我們繼續(xù)使用 Store_Information 這個(gè)表格來(lái)做例子: 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-199

34、9 我們用跟 SQL GROUP BY 那一頁(yè)一樣的例子。這里的不同處是我們加上了欄位別名以及表格別名: SELECT A1.store_name Store, SUM(A1.Sales "Total Sales" FROM Store_Information A1GROUP BY A1.store_name 結(jié)果: Store Total Sales Los Angeles $1800 San Diego $250 Boston $700 在結(jié)果中,資料本身沒(méi)有不同。不同的是欄位的標(biāo)題。這是運(yùn)用欄位別名的結(jié)果。在第二個(gè)欄位上,原本我們的標(biāo)題是 "Sum(Sale

35、s",而現(xiàn)在我們有一個(gè)很清楚的 "Total Sales"。很明顯地, "Total Sales" 能夠比 "Sum(Sales" 更精確地闡述這個(gè)欄位的含意。用表格別名的好處在這里并沒(méi)有顯現(xiàn)出來(lái),不過(guò)這在 下一頁(yè)就會(huì)很清楚了。 表格鏈接現(xiàn)在我們介紹連接(join的概念。要了解連接,我們需要用到許多我們之前已介紹過(guò)的指令。我們先假設(shè)我們有以下的兩個(gè)表格, Store_Information 表格store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250

36、 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 而我們要知道每一區(qū) (region_name 的營(yíng)業(yè)額 (sales。 Geography 這個(gè)表格告訴我們每一區(qū)有哪些店,而 Store_Information 告訴我們每一個(gè)店的營(yíng)業(yè)額。若我們要知道每一區(qū)的營(yíng)業(yè)額,我們需要將這兩個(gè)不同表格中的資料串聯(lián)起來(lái)。當(dāng)我們仔細(xì)了解這兩個(gè)

37、表格后,我們會(huì)發(fā)現(xiàn)它們可經(jīng)由一個(gè)相同的欄位,store_name,連接起來(lái)。我們先將 SQL 句列出,之后再討論每一個(gè)子句的意義: 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 結(jié)果: REGION SALES East $700 West $2050 在第一行中,我們告訴 SQL 去選出兩個(gè)欄位:第一個(gè)欄位是 Geography 表格中的 re

38、gion_name 欄位 (我們?nèi)×艘粋€(gè)別名叫做 REGION;第二個(gè)欄位是 Store_Information 表格中的 sales 欄位 (別名為 SALES。請(qǐng)注意在這里我們有用到表格別名:Geography 表格的別名是 A1,Store_Information 表格的別名是 A2。若我們沒(méi)有用表格別名的話(huà),第一行就會(huì)變成 SELECT Geography.region_name REGION, SUM(Store_Information.Sales SALES 很明顯地,這就復(fù)雜多了。在這里我們可以看到表格別名的功用:它能讓 SQL 句容易被了解,尤其是這個(gè) SQL 句含蓋好幾個(gè)不同

39、的表格時(shí)。 接下來(lái)我們看第三行,就是 WHERE 子句。這是我們闡述連接條件的地方。在這里,我們要確認(rèn) Geography 表格中 store_name 欄位的值與 Store_Information 表格中 store_name 欄位的值是相等的。這個(gè) WHERE 子句是一個(gè)連接的靈魂人物,因?yàn)樗慕巧谴_定兩個(gè)表格之間的連接是正確的。如果 WHERE 子句是錯(cuò)誤的,我們就極可能得到一個(gè)笛卡兒連接 (Cartesian join。笛卡兒連接會(huì)造成我們得到所有兩個(gè)表格每?jī)尚兄g所有可能的組合。在這個(gè)例子中,笛卡兒連接會(huì)讓我們得到 4 x 4 = 16 行的結(jié)果。 外部鏈接之前我們看到的左連接

40、(left join,又稱(chēng)內(nèi)部連接 (inner join。在這個(gè)情況下,要兩個(gè)表格內(nèi)都有同樣的值,那一筆資料才會(huì)被選出。那如果我們想要列出一個(gè)表格中每一筆的資料,無(wú)論它的值在另一個(gè)表格中有沒(méi)有出現(xiàn),那該怎么辦呢?在這個(gè)時(shí)候,我們就需要用到 SQL OUTER JOIN (外部連接 的指令。 外部連接的語(yǔ)法是依數(shù)據(jù)庫(kù)的不同而有所不同的。舉例來(lái)說(shuō),在 Oracle 上,我們會(huì)在 WHERE 子句中要選出所有資料的那個(gè)表格之后加上一個(gè) "(+" 來(lái)代表說(shuō)這個(gè)表格中的所有資料我們都要。 假設(shè)我們有以下的兩個(gè)表格: Store_Information 表格store_name Sa

41、les 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 我們需要知道每一間店的營(yíng)業(yè)額。如果我們用一個(gè)普通的連接,我們將會(huì)漏失掉 'New York'這個(gè)店,因?yàn)樗⒉淮嬖谟?Store_Information 這個(gè)

42、表格。所以,在這個(gè)情況下,我們需要用外部連接來(lái)串聯(lián)這兩個(gè)表格: 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 我們?cè)谶@里是使用了 Oracle 的外部連接語(yǔ)法。 結(jié)果: store_name SALES Boston $700 New York Los Angeles $1800 San Diego $250 請(qǐng)注意: 當(dāng)?shù)诙€(gè)表格沒(méi)有相對(duì)的資料時(shí), SQ

43、L 會(huì)傳回 NULL 值。在這一個(gè)例子中, 'New York' 并不存在于 Store_Information 表格,所以它的 "SALES" 欄位是 NULL. CONCATENATE有的時(shí)候,我們有需要將由不同欄位獲得的資料串連在一起。每一種數(shù)據(jù)庫(kù)都有提供方法來(lái)達(dá)到這個(gè)目的: MySQL: CONCAT( Oracle: CONCAT(, | SQL Server: + CONCAT( 的語(yǔ)法如下: CONCAT(字符串1, 字符串2, 字符串3, .: 將字符串1、字符串2、字符串3,等字符串連在一起。請(qǐng)注意,Oracle的CONCAT(只允許兩個(gè)參

44、數(shù);換言之,一次只能將兩個(gè)字符串串連起來(lái)。不過(guò),在Oracle中,我們可以用'|'來(lái)一次串連多個(gè)字符串。 來(lái)看一個(gè)例子。假設(shè)我們有以下的表格: Geography 表格 region_namestore_nameEastBostonEastNew YorkWestLos AngelesWestSan Diego例子1: MySQL/Oracle: SELECT CONCAT(region_name,store_name FROM Geography WHERE store_name = 'Boston' 結(jié)果: 'EastBoston' 例子2:

45、 Oracle: SELECT region_name | ' ' | store_name FROM Geography WHERE store_name = 'Boston' 結(jié)果: 'East Boston' 例子3: SQL Server: SELECT region_name + ' ' + store_name FROM Geography WHERE store_name = 'Boston' 結(jié)果: 'East Boston' SUBSTRINGSQL 中的 substring 函數(shù)

46、是用來(lái)抓出一個(gè)欄位資料中的其中一部分。這個(gè)函數(shù)的名稱(chēng)在不同的數(shù)據(jù)庫(kù)中不完全一樣: MySQL: SUBSTR(, SUBSTRING( Oracle: SUBSTR( SQL Server: SUBSTRING( 最常用到的方式如下 (在這里我們用SUBSTR(為例: SUBSTR(str,pos: 由 中,選出所有從第 位置開(kāi)始的字符。請(qǐng)注意,這個(gè)語(yǔ)法不適用于SQL Server上。 SUBSTR(str,pos,len: 由 中的第 位置開(kāi)始,選出接下去的 個(gè)字符。 假設(shè)我們有以下的表格: Geography 表格 region_namestore_nameEastBostonEastNe

47、w YorkWestLos AngelesWestSan Diego例1: SELECT SUBSTR(store_name, 3 FROM Geography WHERE store_name = 'Los Angeles' 結(jié)果: 's Angeles' 例2: SELECT SUBSTR(store_name,2,4 FROM Geography WHERE store_name = 'San Diego' 結(jié)果: 'an D' TRIMSQL 中的 TRIM 函數(shù)是用來(lái)移除掉一個(gè)字符串中的字頭或字尾。最常見(jiàn)的用途是移除字首

48、或字尾的空白。這個(gè)函數(shù)在不同的數(shù)據(jù)庫(kù)中有不同的名稱(chēng): MySQL: TRIM(, RTRIM(, LTRIM( Oracle: RTRIM(, LTRIM( SQL Server: RTRIM(, LTRIM( 各種 trim 函數(shù)的語(yǔ)法如下: TRIM(位置 要移除的字符串 FROM 字符串: 位置 的可能值為 LEADING (起頭, TRAILING (結(jié)尾, or BOTH (起頭及結(jié)尾。 這個(gè)函數(shù)將把 要移除的字符串 從字符串的起頭、結(jié)尾,或是起頭及結(jié)尾移除。如果我們沒(méi)有列出 要移除的字符串 是什么的話(huà),那空白就會(huì)被移除。 LTRIM(字符串: 將所有字符串起頭的空白移除。 RTRI

49、M(字符串: 將所有字符串結(jié)尾的空白移除。 例 1: SELECT TRIM(' Sample ' 結(jié)果: 'Sample' 例 2: SELECT LTRIM(' Sample ' 結(jié)果: 'Sample ' 例 3: SELECT RTRIM(' Sample ' 結(jié)果: ' Sample' 表格處理CREATE TABLE表格是數(shù)據(jù)庫(kù)中儲(chǔ)存資料的基本架構(gòu)。在絕大部份的情況下,數(shù)據(jù)庫(kù)廠商不可能知道您需要如何儲(chǔ)存您的資料,所以通常您會(huì)需要自己在數(shù)據(jù)庫(kù)中建立表格。雖然許多數(shù)據(jù)庫(kù)工具可以讓您在不需用到

50、 SQL 的情況下建立表格,不過(guò)由于表格是一個(gè)最基本的架構(gòu),我們決定包括 CREATE TABLE 的語(yǔ)法在這個(gè)網(wǎng)站中。 在我們跳入 CREATE TABLE 的語(yǔ)法之前,我們最好先對(duì)表格這個(gè)東西有些多一點(diǎn)的了解。表格被分為欄位 (column 及列位 (row。每一列代表一筆資料,而每一欄代表一筆資料的一部份。舉例來(lái)說(shuō),如果我們有一個(gè)記載顧客資料的表格,那欄位就有可能包括姓、名、地址、城市、國(guó)家、生日等等。當(dāng)我們對(duì)表格下定義時(shí),我們需要注明欄位的標(biāo)題,以及那個(gè)欄位的資料種類(lèi)。 那,資料種類(lèi)是什么呢?資料可能是以許多不同的形式存在的。它可能是一個(gè)整數(shù) (例如 1,、一個(gè)實(shí)數(shù) (例如 0.55、

51、一個(gè)字符串 (例如 'sql'、一個(gè)日期/時(shí)間 (例如 '2000-JAN-25 03:22:22'、或甚至是以二進(jìn)法 (binary 的狀態(tài)存在。當(dāng)我們?cè)趯?duì)一個(gè)表格下定義時(shí),我們需要對(duì)每一個(gè)欄位的資料種類(lèi)下定義。 (例如 '姓' 這個(gè)欄位的資料種類(lèi)是 char(50代表這是一個(gè) 50 個(gè)字符的字符串。我們需要注意的一點(diǎn)是不同的數(shù)據(jù)庫(kù)有不同的資料種類(lèi),所以在對(duì)表格做出定義之前最好先參考一下數(shù)據(jù)庫(kù)本身的說(shuō)明。 CREATE TABLE 的語(yǔ)法是: CREATE TABLE "表格名"("欄位 1" "

52、;欄位 1 資料種類(lèi)","欄位 2" "欄位 2 資料種類(lèi)",. 若我們要建立我們上面提過(guò)的顧客表格,我們就鍵入以下的 SQL: CREATE TABLE customer(First_Name char(50,Last_Name char(50,Address char(50,City char(50,Country char(25,Birth_Date date CONSTRAINT我們可以限制哪一些資料可以存入表格中。這些限制可以在表格初創(chuàng)時(shí)藉由 CREATE TABLE 語(yǔ)句來(lái)指定,或是之后藉由 ALTER TABLE 語(yǔ)句來(lái)指定。 常

53、見(jiàn)的限制有以下幾種: NOT NULL UNIQUE CHECK 主鍵 (Primary Key 外來(lái)鍵 (Foreign Key 以下對(duì)這幾種限制分別做個(gè)介紹: NOT NULL 在沒(méi)有做出任何限制的情況下,一個(gè)欄位是允許有 NULL 值得。如果我們不允許一個(gè)欄位含有 NULL 值,我們就需要對(duì)那個(gè)欄位做出 NOT NULL 的指定。 舉例來(lái)說(shuō),在以下的語(yǔ)句中, CREATE TABLE Customer (SID integer NOT NULL, Last_Name varchar (30 NOT NULL, First_Name varchar(30; "SID"

54、和 "Last_Name" 這兩個(gè)欄位是不允許有 NULL 值,而 "First_Name" 這個(gè)欄位是可以有 NULL 值得。 UNIQUE UNIQUE 限制是保證一個(gè)欄位中的所有資料都是有不一樣的值。 舉例來(lái)說(shuō),在以下的語(yǔ)句中, CREATE TABLE Customer (SID integer Unique, Last_Name varchar (30, First_Name varchar(30; "SID" 欄位不能有重復(fù)值存在,而 "Last_Name" 及 "First_Name&quo

55、t; 這兩個(gè)欄位則是允許有重復(fù)值存在。 請(qǐng)注意,一個(gè)被指定為主鍵的欄位也一定會(huì)含有 UNIQUE 的特性。相對(duì)來(lái)說(shuō),一個(gè) UNIQUE 的欄位并不一定會(huì)是一個(gè)主鍵。 CHECK CHECK 限制是保證一個(gè)欄位中的所有資料都是符合某些條件。 舉例來(lái)說(shuō),在以下的語(yǔ)句中, CREATE TABLE Customer (SID integer CHECK (SID > 0, Last_Name varchar (30, First_Name varchar(30; "SID" 攔只能包含大于 0 的整數(shù)。 請(qǐng)注意,CHECK 限制目前尚未被執(zhí)行于 MySQL 數(shù)據(jù)庫(kù)上。 主鍵

56、 and 外來(lái)鍵 將于下兩頁(yè)中討論。 主鍵主鍵 (Primary Key 中的每一筆資料都是表格中的唯一值。換言之,它是用來(lái)獨(dú)一無(wú)二地確認(rèn)一個(gè)表格中的每一行資料。主鍵可以是原本資料內(nèi)的一個(gè)欄位,或是一個(gè)人造欄位 (與原本資料沒(méi)有關(guān)系的欄位。主鍵可以包含一或多個(gè)欄位。當(dāng)主鍵包含多個(gè)欄位時(shí),稱(chēng)為組合鍵 (Composite Key。 主鍵可以在建置新表格時(shí)設(shè)定 (運(yùn)用 CREATE TABLE 語(yǔ)句,或是以改變現(xiàn)有的表格架構(gòu)方式設(shè)定 (運(yùn)用 ALTER TABLE。 以下舉幾個(gè)在建置新表格時(shí)設(shè)定主鍵的方式: MySQL: CREATE TABLE Customer (SID integer, La

57、st_Name varchar(30, First_Name varchar(30, PRIMARY KEY (SID; Oracle: CREATE TABLE Customer (SID integer PRIMARY KEY, Last_Name varchar(30, First_Name varchar(30; SQL Server: CREATE TABLE Customer (SID integer PRIMARY KEY, Last_Name varchar(30, First_Name varchar(30; 以下則是以改變現(xiàn)有表格架構(gòu)來(lái)設(shè)定主鍵的方式: MySQL: ALT

58、ER TABLE Customer ADD PRIMARY KEY (SID; Oracle: ALTER TABLE Customer ADD PRIMARY KEY (SID; SQL Server: ALTER TABLE Customer ADD PRIMARY KEY (SID; 請(qǐng)注意,在用ALTER TABLE語(yǔ)句來(lái)添加主鍵之前,我們需要確認(rèn)被用來(lái)當(dāng)做主鍵的欄位是設(shè)定為 NOT NULL ;也就是說(shuō),那個(gè)欄位一定不能沒(méi)有資料。 外來(lái)鍵外來(lái)鍵是一個(gè)(或數(shù)個(gè)指向另外一個(gè)表格主鍵的欄位。外來(lái)鍵的目的是確定資料的參考完整性(referential integrity。換言之,只有被準(zhǔn)許的資

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論