版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
無(wú)論您是一位SQL的新手,或是一位只是需要對(duì)SQL復(fù)習(xí)一下的資料倉(cāng)儲(chǔ)業(yè)界老將,您就來(lái)對(duì)地方了。這個(gè)SQL教材網(wǎ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有很透徹的了解并不是一朝一夕可以完成的,可是要對(duì)SQL有個(gè)根本的了解并不難。希望在看完這個(gè)網(wǎng)站后,您也會(huì)有同樣的想法。SQL指令SELECT是用來(lái)做什么的呢?一個(gè)最常用的方式是將資料從數(shù)據(jù)庫(kù)中的表格內(nèi)選出。從這一句答復(fù)中,我們馬上可以看到兩個(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í)際上是怎么用的。假設(shè)我們有以下這個(gè)表格:store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999假設(shè)要選出所有的店名(store_Name),我們就打入:SELECTstore_nameFROMStore_Information結(jié)果:store_nameLosAngelesSanDiegoLosAngelesBoston我們一次可以讀取好幾個(gè)欄位,也可以同時(shí)由好幾個(gè)表格中選資料。DISTINCTSELECT指令讓我們能夠讀取表格中一個(gè)或數(shù)個(gè)欄位的所有資料。這將把所有的資料都抓出,無(wú)論資料值有無(wú)重復(fù)。在資料處理中,我們會(huì)經(jīng)常碰到需要找出表格內(nèi)的不同資料值的情況。換句話說(shuō),我們需要知道這個(gè)表格/欄位內(nèi)有哪些不同的值,而每個(gè)值出現(xiàn)的次數(shù)并不重要。這要如何達(dá)成呢?在SQL中,這是很容易做到的。我們只要在SELECT后加上一個(gè)DISTINCT就可以了。DISTINCT的語(yǔ)法如下:SELECTDISTINCT"欄位名"FROM"表格名"舉例來(lái)說(shuō),假設(shè)要在以下的表格,Store_Information,找出所有不同的店名時(shí),Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTDISTINCTstore_nameFROMStore_Information結(jié)果:store_nameLosAngelesSanDiegoBostonWHERE我們并不一定每一次都要將表格內(nèi)的資料都完全抓出。在許多時(shí)候,我們會(huì)需要選擇性地抓資料。就我們的例子來(lái)說(shuō),我們可能只要抓出營(yíng)業(yè)額超過(guò)$1,000的資料。要做到這一點(diǎn),我們就需要用到WHERE這個(gè)指令。這個(gè)指令的語(yǔ)法如下:SELECT"欄位名"FROM"表格名"WHERE"條件"假設(shè)我們要由以下的表格抓出營(yíng)業(yè)額超過(guò)$1,000的資料,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTstore_nameFROMStore_InformationWHERESales>1000結(jié)果:store_nameLosAngelesANDOR在上一頁(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"表格名"WHERE"簡(jiǎn)單條件"{[AND|OR]"簡(jiǎn)單條件"}+{}+代表{}之內(nèi)的情況會(huì)發(fā)生一或?qū)掖?。在這里的意思就是AND加簡(jiǎn)單條件及OR加簡(jiǎn)單條件的情況可以發(fā)生一或?qū)掖巍A硗猓覀兛梢杂?)來(lái)代表?xiàng)l件的先后次序。舉例來(lái)說(shuō),我們假設(shè)要在Store_Information表格中選出所有Sales高于$1,000或是Sales在$500及$275之間的資料的話,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTstore_nameFROMStore_InformationWHERESales>1000OR(Sales<500ANDSales>275)結(jié)果:store_nameLosAngelesSanFranciscoIN在SQL中,在兩個(gè)情況下會(huì)用到IN這個(gè)指令;這一頁(yè)將介紹其中之一:與WHERE有關(guān)的那一個(gè)情況。在這個(gè)用法下,我們事先道至少一個(gè)我們需要的值,而我們將這些知道的值都放入IN這個(gè)子句。IN指令的語(yǔ)法為下:SELECT"欄位名"FROM"表格名"WHERE"欄位名"IN('值一','值二',...)在括號(hào)內(nèi)可以有一或多個(gè)值,而不同值之間由逗點(diǎn)分開(kāi)。值可以是數(shù)目或是文字。假設(shè)在括號(hào)內(nèi)只有一個(gè)值,那這個(gè)子句就等于WHERE"欄位名"='值一'舉例來(lái)說(shuō),假設(shè)我們要在Store_Information表格中找出所有含蓋LosAngeles或SanDiego的資料,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECT*FROMStore_InformationWHEREstore_nameIN('LosAngeles','SanDiego')結(jié)果:store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999BETWEENIN這個(gè)指令可以讓我們依照一或數(shù)個(gè)不連續(xù)(discrete)的值的限制之內(nèi)抓出資料庫(kù)中的值,而B(niǎo)ETWEEN那么是讓我們可以運(yùn)用一個(gè)范圍(range)內(nèi)抓出資料庫(kù)中的值。BETWEEN這個(gè)子句的語(yǔ)法如下:SELECT"欄位名"FROM"表格名"WHERE"欄位名"BETWEEN'值一'AND'值二'這將選出欄位值包含在值一及值二之間的每一筆資料。舉例來(lái)說(shuō),假設(shè)我們要由Store_Information表格中找出所有介于January6,1999及January10,1999中的資料,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECT*FROMStore_InformationWHEREDateBETWEEN'Jan-06-1999'AND'Jan-10-1999'請(qǐng)讀者注意:在不同的數(shù)據(jù)庫(kù)中,日期的儲(chǔ)存法可能會(huì)有所不同。在這里我們選擇了其中一種儲(chǔ)存法。結(jié)果:store_nameSalesDateSanDiego$250Jan-07-1999SanFrancisco$300Jan-08-1999Boston$700Jan-08-1999LIKELIKE是另一個(gè)在WHERE子句中會(huì)用到的指令。根本上,LIKE能讓我們依據(jù)一個(gè)模式(pattern)來(lái)找出我們要的資料。相對(duì)來(lái)說(shuō),在運(yùn)用IN的時(shí)候,我們完全地知道我們需要的條件;在運(yùn)用BETWEEN的時(shí)候,我們那么是列出一個(gè)范圍。LIKE的語(yǔ)法如下:SELECT"欄位名"FROM"表格名"WHERE"欄位名"LIKE{模式}{模式}經(jīng)常包括野卡(wildcard).以下是幾個(gè)例子:'A_Z':所有以'A'起頭,另一個(gè)任何值的字原,且以'Z'為結(jié)尾的字符串。'ABZ'和'A2Z'都符合這一個(gè)模式,而'AKKZ'并不符合(因?yàn)樵贏和Z之間有兩個(gè)字原,而不是一個(gè)字原)。'ABC%':所有以'ABC'起頭的字符串。舉例來(lái)說(shuō),'ABCD'和'ABCABC'都符合這個(gè)模式。'%XYZ':所有以'XYZ'結(jié)尾的字符串。舉例來(lái)說(shuō),'WXYZ'和'ZZXYZ'都符合這個(gè)模式。'%AN%':所有含有'AN'這個(gè)模式的字符串。舉例來(lái)說(shuō),'LOSANGELES'和'SANFRANCISCO'都符合這個(gè)模式。我們將以上最后一個(gè)例子用在我們的Store_Information表格上:Store_Information表格store_nameSalesDateLOSANGELES$1500Jan-05-1999SANDIEGO$250Jan-07-1999SANFRANCISCO$300Jan-08-1999BOSTON$700Jan-08-1999我們就鍵入,SELECT*FROMStore_InformationWHEREstore_nameLIKE'%AN%'結(jié)果:store_nameSalesDateLOSANGELES$1500Jan-05-1999SANFRANCISCO$300Jan-08-1999SANDIEGO$250Jan-07-1999ORDERBY到目前為止,我們已學(xué)到如何藉由SELECT及WHERE這兩個(gè)指令將資料由表格中抓出。不過(guò)我們尚未提到這些資料要如何排列。這其實(shí)是一個(gè)很重要的問(wèn)題。事實(shí)上,我們經(jīng)常需要能夠?qū)⒆コ龅馁Y料做一個(gè)有系統(tǒng)的顯示。這可能是由小往大(ascending)或是由大往小(descending)。在這種情況下,我們就可以運(yùn)用ORDERBY這個(gè)指令來(lái)到達(dá)我們的目的。ORDERBY的語(yǔ)法如下:SELECT"欄位名"FROM"表格名"[WHERE"條件"]ORDERBY"欄位名"[ASC,DESC][]代表WHERE子句不是一定需要的。不過(guò),如果WHERE子句存在的話,它是在ORDERBY子句之前。ASC代表結(jié)果會(huì)以由小往大的順序列出,而DESC代表結(jié)果會(huì)以由大往小的順序列出。如果兩者皆沒(méi)有被寫出的話,那我們就會(huì)用ASC。我們可以照好幾個(gè)不同的欄位來(lái)排順序。在這個(gè)情況下,ORDERBY子句的語(yǔ)法如下(假設(shè)有兩個(gè)欄位):ORDERBY"欄位一"[ASC,DESC],"欄位二"[ASC,DESC]假設(shè)我們對(duì)這兩個(gè)欄位都選擇由小往大的話,那這個(gè)子句就會(huì)造成結(jié)果是依據(jù)"欄位一"由小往大排。假設(shè)有好幾筆資料"欄位一"的值相等,那這幾筆資料就依據(jù)"欄位二"由小往大排。舉例來(lái)說(shuō),假設(shè)我們要依照Sales欄位的由大往小列出Store_Information表格中的資料,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999SanFrancisco$300an-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTstore_name,Sales,DateFROMStore_InformationORDERBYSalesDESC結(jié)果:store_nameSalesDateLosAngeles$1500Jan-05-1999Boston$700Jan-08-1999SanFrancisco$300Jan-08-1999SanDiego$250Jan-07-1999在以上的例子中,我們用欄位名來(lái)指定排列順序的依據(jù)。除了欄位名外,我們也可以用欄位的順序(依據(jù)SQL句中的順序)。在SELECT后的第一個(gè)欄位為1,第二個(gè)欄位為2,以此類推。在上面這個(gè)例子中,我們用以下這句SQL可以到達(dá)完全一樣的效果:SELECTstore_name,Sales,DateFROMStore_InformationORDERBY2DESC函數(shù)既然數(shù)據(jù)庫(kù)中有許多資料都是已數(shù)字的型態(tài)存在,一個(gè)很重要的用途就是要能夠?qū)@些數(shù)字做一些運(yùn)算,例如將它們總合起來(lái),或是找出它們的平均值。SQL有提供一些這一類的函數(shù)。它們是:AVG(平均)COUNT(計(jì)數(shù))MAX(最大值)MIN(最小值)SUM(總合)運(yùn)用函數(shù)的語(yǔ)法是:SELECT"函數(shù)名"("欄位名")FROM"表格名"舉例來(lái)說(shuō),假設(shè)我們要由我們的范例表格中求出Sales欄位的總合,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTSUM(Sales)FROMStore_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ù)庫(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ǔ)法是:SELECTCOUNT("欄位名")FROM"表格名"舉例來(lái)說(shuō),假設(shè)我們要找出我們的范例表格中有幾筆store_name欄不是空白的資料時(shí),Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTCOUNT(store_name)FROMStore_InformationWHEREstore_nameisnotNULL結(jié)果:Count(store_name)4"isnotNULL"是"這個(gè)欄位不是空白"的意思。COUNT和DISTINCT經(jīng)常被合起來(lái)使用,目的是找出表格中有多少筆不同的資料(至于這些資料實(shí)際上是什么并不重要)。舉例來(lái)說(shuō),如果我們要找出我們的表格中有多少個(gè)不同的store_name,我們就鍵入,SELECTCOUNT(DISTINCTstore_name)FROMStore_Information結(jié)果:Count(DISTINCTstore_name)3GROUPBY我們現(xiàn)在回到函數(shù)上。記得我們用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"表格名"GROUPBY"欄位1"在我們的范例上,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們就鍵入,SELECTstore_name,SUM(Sales)FROMStore_InformationGROUPBYstore_name結(jié)果:store_nameSUM(Sales)LosAngeles$1800SanDiego$250Boston$700當(dāng)我們選不只一個(gè)欄位,且其中至少一個(gè)欄位有包含函數(shù)的運(yùn)用時(shí),我們就需要用到GROUPBY這個(gè)指令。在這個(gè)情況下,我們需要確定我們有GROUPBY所有其他的欄位。換句話說(shuō),除了有包括函數(shù)的欄位外,我們都需要將其放在GROUPBY的子句中。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并不一定要包含GROUPBY子句。HAVING的語(yǔ)法如下:SELECT"欄位1",SUM("欄位2")FROM"表格名"GROUPBY"欄位1"HAVING(函數(shù)條件)請(qǐng)讀者注意:如果被SELECT的只有函數(shù)欄,那就不需要GROUPBY子句。在我們Store_Information表格這個(gè)例子中,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999假設(shè)我們要找出Sales大于$1,500的store_name,我們就鍵入,SELECTstore_name,SUM(sales)FROMStore_InformationGROUPBYstore_nameHAVINGSUM(sales)>1500結(jié)果:store_nameSUM(Sales)LosAngeles$1800ALIAS接下來(lái),我們討論alias(別名)在SQL上的用處。最常用到的別名有兩種:欄位別名及表格別名。簡(jiǎn)單地來(lái)說(shuō),欄位別名的目的是為了讓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)有這么易懂了。假設(shè)我們用欄位別名的話,就可以確認(rèn)結(jié)果中的欄位名是簡(jiǎn)單易懂的。第二種別名是表格別名。要給一個(gè)表格取一個(gè)別名,只要在FROM子句中的表格名后空一格,然后再列出要用的表格別名就可以了。這在我們要用SQL由數(shù)個(gè)不同的表格中獲取資料時(shí)是很方便的。這一點(diǎn)我們?cè)谥笳劦竭B接(join)時(shí)會(huì)看到。我們先來(lái)看一下欄位別名和表格別名的語(yǔ)法:SELECT"表格別名"."欄位1""欄位別名"FROM"表格名""表格別名"根本上,這兩種別名都是放在它們要替代的物件后面,而它們中間由一個(gè)空白分開(kāi)。我們繼續(xù)使用Store_Information這個(gè)表格來(lái)做例子:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們用跟SQLGROUPBY那一頁(yè)一樣的例子。這里的不同處是我們加上了欄位別名以及表格別名:SELECTA1.store_nameStore,SUM(A1.Sales)"TotalSales"FROMStore_InformationA1GROUPBYA1.store_name結(jié)果:StoreTotalSalesLosAngeles$1800SanDiego$250Boston$700在結(jié)果中,資料本身沒(méi)有不同。不同的是欄位的標(biāo)題。這是運(yùn)用欄位別名的結(jié)果。在第二個(gè)欄位上,原本我們的標(biāo)題是"Sum(Sales)",而現(xiàn)在我們有一個(gè)很清楚的"TotalSales"。很明顯地,"TotalSales"能夠比"Sum(Sales)"更精確地闡述這個(gè)欄位的含意。用表格別名的好處在這里并沒(méi)有顯現(xiàn)出來(lái),不過(guò)這在下一頁(yè)就會(huì)很清楚了。表格鏈接現(xiàn)在我們介紹連接(join)的概念。要了解連接,我們需要用到許多我們之前已介紹過(guò)的指令。我們先假設(shè)我們有以下的兩個(gè)表格,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Geography表格region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego而我們要知道每一區(qū)(region_name)的營(yíng)業(yè)額(sales)。Geography這個(gè)表格告訴我們每一區(qū)有哪些店,而Store_Information告訴我們每一個(gè)店的營(yíng)業(yè)額。假設(shè)我們要知道每一區(qū)的營(yíng)業(yè)額,我們需要將這兩個(gè)不同表格中的資料串聯(lián)起來(lái)。當(dāng)我們仔細(xì)了解這兩個(gè)表格后,我們會(huì)發(fā)現(xiàn)它們可經(jīng)由一個(gè)相同的欄位,store_name,連接起來(lái)。我們先將SQL句列出,之后再討論每一個(gè)子句的意義:SELECTA1.region_nameREGION,SUM(A2.Sales)SALESFROMGeographyA1,Store_InformationA2WHEREA1.store_name=A2.store_nameGROUPBYA1.region_name結(jié)果:REGIONSALESEast$700West$2050在第一行中,我們告訴SQL去選出兩個(gè)欄位:第一個(gè)欄位是Geography表格中的region_name欄位(我們?nèi)×艘粋€(gè)別名叫做REGION);第二個(gè)欄位是Store_Information表格中的sales欄位(別名為SALES)。請(qǐng)注意在這里我們有用到表格別名:Geography表格的別名是A1,Store_Information表格的別名是A2。假設(shè)我們沒(méi)有用表格別名的話,第一行就會(huì)變成SELECTGeography.region_nameREGION,SUM(Store_Information.Sales)SALES很明顯地,這就復(fù)雜多了。在這里我們可以看到表格別名的功用:它能讓SQL句容易被了解,尤其是這個(gè)SQL句含蓋好幾個(gè)不同的表格時(shí)。接下來(lái)我們看第三行,就是WHERE子句。這是我們闡述連接條件的地方。在這里,我們要確認(rèn)Geography表格中store_name欄位的值與Store_Information表格中store_name欄位的值是相等的。這個(gè)WHERE子句是一個(gè)連接的靈魂人物,因?yàn)樗慕巧谴_定兩個(gè)表格之間的連接是正確的。如果WHERE子句是錯(cuò)誤的,我們就極可能得到一個(gè)笛卡兒連接(Cartesianjoin)。笛卡兒連接會(huì)造成我們得到所有兩個(gè)表格每?jī)尚兄g所有可能的組合。在這個(gè)例子中,笛卡兒連接會(huì)讓我們得到4x4=16行的結(jié)果。外部鏈接之前我們看到的左連接(leftjoin),又稱內(nèi)部連接(innerjoin)。在這個(gè)情況下,要兩個(gè)表格內(nèi)都有同樣的值,那一筆資料才會(huì)被選出。那如果我們想要列出一個(gè)表格中每一筆的資料,無(wú)論它的值在另一個(gè)表格中有沒(méi)有出現(xiàn),那該怎么辦呢?在這個(gè)時(shí)候,我們就需要用到SQLOUTERJOIN(外部連接)的指令。外部連接的語(yǔ)法是依數(shù)據(jù)庫(kù)的不同而有所不同的。舉例來(lái)說(shuō),在Oracle上,我們會(huì)在WHERE子句中要選出所有資料的那個(gè)表格之后加上一個(gè)"(+)"來(lái)代表說(shuō)這個(gè)表格中的所有資料我們都要。假設(shè)我們有以下的兩個(gè)表格:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Geography表格region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego我們需要知道每一間店的營(yíng)業(yè)額。如果我們用一個(gè)普通的連接,我們將會(huì)漏失掉'NewYork'這個(gè)店,因?yàn)樗⒉淮嬖谟赟tore_Information這個(gè)表格。所以,在這個(gè)情況下,我們需要用外部連接來(lái)串聯(lián)這兩個(gè)表格:SELECTA1.store_name,SUM(A2.Sales)SALESFROMGeorgraphyA1,Store_InformationA2WHEREA1.store_name=A2.store_name(+)GROUPBYA1.store_name我們?cè)谶@里是使用了Oracle的外部連接語(yǔ)法。結(jié)果:store_nameSALESBoston$700NewYorkLosAngeles$1800SanDiego$250請(qǐng)注意:當(dāng)?shù)诙€(gè)表格沒(méi)有相對(duì)的資料時(shí),SQL會(huì)傳回NULL值。在這一個(gè)例子中,'NewYork'并不存在于Store_Information表格,所以它的"SALES"欄位是NULL.CONCATENATE有的時(shí)候,我們有需要將由不同欄位獲得的資料串連在一起。每一種數(shù)據(jù)庫(kù)都有提供方法來(lái)到達(dá)這個(gè)目的:MySQL:CONCAT()Oracle:CONCAT(),||SQLServer:+CONCAT()的語(yǔ)法如下:CONCAT(字符串1,字符串2,字符串3,...):將字符串1、字符串2、字符串3,等字符串連在一起。請(qǐng)注意,Oracle的CONCAT()只允許兩個(gè)參數(shù);換言之,一次只能將兩個(gè)字符串串連起來(lái)。不過(guò),在Oracle中,我們可以用'||'來(lái)一次串連多個(gè)字符串。來(lái)看一個(gè)例子。假設(shè)我們有以下的表格:Geography表格region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego例子1:MySQL/Oracle:SELECTCONCAT(region_name,store_name)FROMGeographyWHEREstore_name='Boston';結(jié)果:'EastBoston'例子2:Oracle:SELECTregion_name||''||store_nameFROMGeographyWHEREstore_name='Boston';結(jié)果:'EastBoston'例子3:SQLServer:SELECTregion_name+''+store_nameFROMGeographyWHEREstore_name='Boston';結(jié)果:'EastBoston'SUBSTRINGSQL中的substring函數(shù)是用來(lái)抓出一個(gè)欄位資料中的其中一局部。這個(gè)函數(shù)的名稱在不同的數(shù)據(jù)庫(kù)中不完全一樣:MySQL:SUBSTR(),SUBSTRING()Oracle:SUBSTR()SQLServer:SUBSTRING()最常用到的方式如下(在這里我們用SUBSTR()為例):SUBSTR(str,pos):由<str>中,選出所有從第<pos>位置開(kāi)始的字符。請(qǐng)注意,這個(gè)語(yǔ)法不適用于SQLServer上。SUBSTR(str,pos,len):由<str>中的第<pos>位置開(kāi)始,選出接下去的<len>個(gè)字符。假設(shè)我們有以下的表格:Geography表格region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego例1:SELECTSUBSTR(store_name,3)FROMGeographyWHEREstore_name='LosAngeles';結(jié)果:'sAngeles'例2:SELECTSUBSTR(store_name,2,4)FROMGeographyWHEREstore_name='SanDiego';結(jié)果:'anD'TRIMSQL中的TRIM函數(shù)是用來(lái)移除掉一個(gè)字符串中的字頭或字尾。最常見(jiàn)的用途是移除字首或字尾的空白。這個(gè)函數(shù)在不同的數(shù)據(jù)庫(kù)中有不同的名稱:MySQL:TRIM(),RTRIM(),LTRIM()Oracle:RTRIM(),LTRIM()SQLServer:RTRIM(),LTRIM()各種trim函數(shù)的語(yǔ)法如下:TRIM([[位置][要移除的字符串]FROM]字符串):[位置]的可能值為L(zhǎng)EADING(起頭),TRAILING(結(jié)尾),orBOTH(起頭及結(jié)尾)。這個(gè)函數(shù)將把[要移除的字符串]從字符串的起頭、結(jié)尾,或是起頭及結(jié)尾移除。如果我們沒(méi)有列出[要移除的字符串]是什么的話,那空白就會(huì)被移除。LTRIM(字符串):將所有字符串起頭的空白移除。RTRIM(字符串):將所有字符串結(jié)尾的空白移除。例1:SELECTTRIM('Sample');結(jié)果:'Sample'例2:SELECTLTRIM('Sample');結(jié)果:'Sample'例3:SELECTRTRIM('Sample');結(jié)果:'Sample'表格處理CREATETABLE表格是數(shù)據(jù)庫(kù)中儲(chǔ)存資料的根本架構(gòu)。在絕大部份的情況下,數(shù)據(jù)庫(kù)廠商不可能知道您需要如何儲(chǔ)存您的資料,所以通常您會(huì)需要自己在數(shù)據(jù)庫(kù)中建立表格。雖然許多數(shù)據(jù)庫(kù)工具可以讓您在不需用到SQL的情況下建立表格,不過(guò)由于表格是一個(gè)最根本的架構(gòu),我們決定包括CREATETABLE的語(yǔ)法在這個(gè)網(wǎng)站中。在我們跳入CREATETABLE的語(yǔ)法之前,我們最好先對(duì)表格這個(gè)東西有些多一點(diǎn)的了解。表格被分為欄位(column)及列位(row)。每一列代表一筆資料,而每一欄代表一筆資料的一部份。舉例來(lái)說(shuō),如果我們有一個(gè)記載顧客資料的表格,那欄位就有可能包括姓、名、地址、城市、國(guó)家、生日???等等。當(dāng)我們對(duì)表格下定義時(shí),我們需要注明欄位的標(biāo)題,以及那個(gè)欄位的資料種類。那,資料種類是什么呢?資料可能是以許多不同的形式存在的。它可能是一個(gè)整數(shù)(例如1),、一個(gè)實(shí)數(shù)(例如0.55)、一個(gè)字符串(例如'sql')、一個(gè)日期/時(shí)間(例如'2000-JAN-2503:22:22')、或甚至是以二進(jìn)法(binary)的狀態(tài)存在。當(dāng)我們?cè)趯?duì)一個(gè)表格下定義時(shí),我們需要對(duì)每一個(gè)欄位的資料種類下定義。(例如'姓'這個(gè)欄位的資料種類是char(50)──代表這是一個(gè)50個(gè)字符的字符串)。我們需要注意的一點(diǎn)是不同的數(shù)據(jù)庫(kù)有不同的資料種類,所以在對(duì)表格做出定義之前最好先參考一下數(shù)據(jù)庫(kù)本身的說(shuō)明。CREATETABLE的語(yǔ)法是:CREATETABLE"表格名"("欄位1""欄位1資料種類","欄位2""欄位2資料種類",...)假設(shè)我們要建立我們上面提過(guò)的顧客表格,我們就鍵入以下的SQL:CREATETABLEcustomer(First_Namechar(50),Last_Namechar(50),Addresschar(50),Citychar(50),Countrychar(25),Birth_Datedate)CONSTRAINT我們可以限制哪一些資料可以存入表格中。這些限制可以在表格初創(chuàng)時(shí)藉由CREATETABLE語(yǔ)句來(lái)指定,或是之后藉由ALTERTABLE語(yǔ)句來(lái)指定。常見(jiàn)的限制有以下幾種:NOTNULLUNIQUECHECK主鍵(PrimaryKey)外來(lái)鍵(ForeignKey)以下對(duì)這幾種限制分別做個(gè)介紹:NOTNULL在沒(méi)有做出任何限制的情況下,一個(gè)欄位是允許有NULL值得。如果我們不允許一個(gè)欄位含有NULL值,我們就需要對(duì)那個(gè)欄位做出NOTNULL的指定。舉例來(lái)說(shuō),在以下的語(yǔ)句中,CREATETABLECustomer(SIDintegerNOTNULL,Last_Namevarchar(30)NOTNULL,First_Namevarchar(30));"SID"和"Last_Name"這兩個(gè)欄位是不允許有NULL值,而"First_Name"這個(gè)欄位是可以有NULL值得。UNIQUEUNIQUE限制是保證一個(gè)欄位中的所有資料都是有不一樣的值。舉例來(lái)說(shuō),在以下的語(yǔ)句中,CREATETABLECustomer(SIDintegerUnique,Last_Namevarchar(30),First_Namevarchar(30));"SID"欄位不能有重復(fù)值存在,而"Last_Name"及"First_Name"這兩個(gè)欄位那么是允許有重復(fù)值存在。請(qǐng)注意,一個(gè)被指定為主鍵的欄位也一定會(huì)含有UNIQUE的特性。相對(duì)來(lái)說(shuō),一個(gè)UNIQUE的欄位并不一定會(huì)是一個(gè)主鍵。CHECKCHECK限制是保證一個(gè)欄位中的所有資料都是符合某些條件。舉例來(lái)說(shuō),在以下的語(yǔ)句中,CREATETABLECustomer(SIDintegerCHECK(SID>0),Last_Namevarchar(30),First_Namevarchar(30));"SID"攔只能包含大于0的整數(shù)。請(qǐng)注意,CHECK限制目前尚未被執(zhí)行于MySQL數(shù)據(jù)庫(kù)上。主鍵and外來(lái)鍵將于下兩頁(yè)中討論。主鍵主鍵(PrimaryKey)中的每一筆資料都是表格中的唯一值。換言之,它是用來(lái)獨(dú)一無(wú)二地確認(rèn)一個(gè)表格中的每一行資料。主鍵可以是原本資料內(nèi)的一個(gè)欄位,或是一個(gè)人造欄位(與原本資料沒(méi)有關(guān)系的欄位)。主鍵可以包含一或多個(gè)欄位。當(dāng)主鍵包含多個(gè)欄位時(shí),稱為組合鍵(CompositeKey)。主鍵可以在建置新表格時(shí)設(shè)定(運(yùn)用CREATETABLE語(yǔ)句),或是以改變現(xiàn)有的表格架構(gòu)方式設(shè)定(運(yùn)用ALTERTABLE)。以下舉幾個(gè)在建置新表格時(shí)設(shè)定主鍵的方式:MySQL:CREATETABLECustomer(SIDinteger,Last_Namevarchar(30),First_Namevarchar(30),PRIMARYKEY(SID));Oracle:CREATETABLECustomer(SIDintegerPRIMARYKEY,Last_Namevarchar(30),First_Namevarchar(30));SQLServer:CREATETABLECustomer(SIDintegerPRIMARYKEY,Last_Namevarchar(30),First_Namevarchar(30));以下那么是以改變現(xiàn)有表格架構(gòu)來(lái)設(shè)定主鍵的方式:MySQL:ALTERTABLECustomerADDPRIMARYKEY(SID);Oracle:ALTERTABLECustomerADDPRIMARYKEY(SID);SQLServer:ALTERTABLECustomerADDPRIMARYKEY(SID);請(qǐng)注意,在用ALTERTABLE語(yǔ)句來(lái)添加主鍵之前,我們需要確認(rèn)被用來(lái)當(dāng)做主鍵的欄位是設(shè)定為『NOTNULL』;也就是說(shuō),那個(gè)欄位一定不能沒(méi)有資料。外來(lái)鍵外來(lái)鍵是一個(gè)(或數(shù)個(gè))指向另外一個(gè)表格主鍵的欄位。外來(lái)鍵的目的是確定資料的參考完整性(referentialintegrity)。換言之,只有被準(zhǔn)許的資料值才會(huì)被存入數(shù)據(jù)庫(kù)內(nèi)。舉例來(lái)說(shuō),假設(shè)我們有兩個(gè)表格:一個(gè)CUSTOMER表格,里面記錄了所有顧客的資料;另一個(gè)ORDERS表格,里面記錄了所有顧客訂購(gòu)的資料。在這里的一個(gè)限制,就是所有的訂購(gòu)資料中的顧客,都一定是要跟在CUSTOMER表格中存在。在這里,我們就會(huì)在ORDERS表格中設(shè)定一個(gè)外來(lái)鍵,而這個(gè)外來(lái)鍵是指向CUSTOMER表格中的主鍵。這樣一來(lái),我們就可以確定所有在ORDERS表格中的顧客都存在CUSTOMER表格中。換句話說(shuō),ORDERS表格之中,不能有任何顧客是不存在于CUSTOMER表格中的資料。這兩個(gè)表格的結(jié)構(gòu)將會(huì)是如下:CUSTOMER表格欄位名性質(zhì)SID主鍵Last_NameFirst_NameORDERS表格欄位名性質(zhì)Order_ID主鍵Order_DateCustomer_SID外來(lái)鍵Amount在以上的例子中,ORDERS表格中的customer_SID欄位是一個(gè)指向CUSTOMERS表格中SID欄位的外來(lái)鍵。以以下出幾個(gè)在建置ORDERS表格時(shí)指定外來(lái)鍵的方式:MySQL:CREATETABLEORDERS(Order_IDinteger,Order_Datedate,Customer_SIDinteger,Amountdouble,PrimaryKey(Order_ID),ForeignKey(Customer_SID)referencesCUSTOMER(SID));Oracle:CREATETABLEORDERS(Order_IDintegerprimarykey,Order_Datedate,Customer_SIDintegerreferencesCUSTOMER(SID),Amountdouble);SQLServer:CREATETABLEORDERS(Order_IDintegerprimarykey,Order_Datedatetime,Customer_SIDintegerreferencesCUSTOMER(SID),Amountdouble);以下的例子那么是藉著改變表格架構(gòu)來(lái)指定外來(lái)鍵。這里假設(shè)ORDERS表格已經(jīng)被建置,而外來(lái)鍵尚未被指定:MySQL:ALTERTABLEORDERSADDFOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);Oracle:ALTERTABLEORDERSADD(CONSTRAINTfk_orders1)FOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);SQLServer:ALTERTABLEORDERSADDFOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);CREATEVIEW視觀表(Views)可以被當(dāng)作是虛擬表格。它跟表格的不同是,表格中有實(shí)際儲(chǔ)存資料,而視觀表是建立在表格之上的一個(gè)架構(gòu),它本身并不實(shí)際儲(chǔ)存資料。建立一個(gè)視觀表的語(yǔ)法如下:CREATEVIEW"VIEW_NAME"AS"SQL語(yǔ)句""SQL語(yǔ)句"可以是任何一個(gè)我們?cè)谶@個(gè)教材中有提到的SQL。來(lái)看一個(gè)例子。假設(shè)我們有以下的表格:TABLECustomer(First_Namechar(50),Last_Namechar(50),Addresschar(50),Citychar(50),Countrychar(25),Birth_Datedate)假設(shè)要在這個(gè)表格上建立一個(gè)包括First_Name,Last_Name,和Country這三個(gè)欄位的視觀表,我們就打入,CREATEVIEWV_CustomerASSELECTFirst_Name,Last_Name,CountryFROMCustomer現(xiàn)在,我們就有一個(gè)叫做V_Customer的視觀表:ViewV_Customer(First_Namechar(50),Last_Namechar(50),Countrychar(25))我們也可以用視觀表來(lái)連接兩個(gè)表格。在這個(gè)情況下,使用者就可以直接由一個(gè)視觀表中找出她要的信息,而不需要由兩個(gè)不同的表格中去做一次連接的動(dòng)作。假設(shè)有以下的兩個(gè)表格:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Geography表格region_namestore_nameEastBostonEastNewYorkWestLosAngelesWestSanDiego我們就可以用以下的指令來(lái)建一個(gè)包括每個(gè)地區(qū)(region)銷售額(sales)的視觀表:CREATEVIEWV_REGION_SALESASSELECTA1.region_nameREGION,SUM(A2.Sales)SALESFROMGeographyA1,Store_InformationA2WHEREA1.store_name=A2.store_nameGROUPBYA1.region_name這就給我們有一個(gè)名為V_REGION_SALES的視觀表。這個(gè)視觀表包含不同地區(qū)的銷售哦。如果我們要從這個(gè)視觀表中獲取資料,我們就打入,SELECT*FROMV_REGION_SALES結(jié)果:REGIONSALESEast$700West$2050CREATEINDEX索引(Index)可以幫助我們從表格中快速地找到需要的資料。舉例來(lái)說(shuō),假設(shè)我們要在一本園藝書(shū)中找如何種植青椒的訊息。假設(shè)這本書(shū)沒(méi)有索引的話,那我們是必須要從頭開(kāi)始讀,直到我們找到有關(guān)種直青椒的地方為止。假設(shè)這本書(shū)有索引的話,我們就可以先去索引找出種植青椒的信息是在哪一頁(yè),然后直接到那一頁(yè)去閱讀。很明顯地,運(yùn)用索引是一種有效且省時(shí)的方式。從數(shù)據(jù)庫(kù)表格中尋找資料也是同樣的原理。如果一個(gè)表格沒(méi)有索引的話,數(shù)據(jù)庫(kù)系統(tǒng)就需要將整個(gè)表格的資料讀出(這個(gè)過(guò)程叫做'tablescan')。假設(shè)有適當(dāng)?shù)乃饕嬖冢瑪?shù)據(jù)庫(kù)系統(tǒng)就可以先由這個(gè)索引去找出需要的資料是在表格的什么地方,然后直接去那些地方抓資料。這樣子速度就快多了。因此,在表格上建立索引是一件有利于系統(tǒng)效率的事。一個(gè)索引可以涵蓋一或多個(gè)欄位。建立索引的語(yǔ)法如下:CREATEINDEX"INDEX_NAME"ON"TABLE_NAME"(COLUMN_NAME)現(xiàn)在假設(shè)我們有以下這個(gè)表格,TABLECustomer(First_Namechar(50),Last_Namechar(50),Addresschar(50),Citychar(50),Countrychar(25),Birth_Datedate)假設(shè)我們要在Last_Name這個(gè)欄位上建一個(gè)索引,我們就打入以下的指令,CREATEINDEXIDX_CUSTOMER_LAST_NAMEonCUSTOMER(Last_Name)我們要在City及Country這兩個(gè)欄位上建一個(gè)索引,我們就打入以下的指令,CREATEINDEXIDX_CUSTOMER_LOCATIONonCUSTOMER(City,Country)索引的命名并沒(méi)有一個(gè)固定的方式。通常會(huì)用的方式是在名稱前加一個(gè)字首,例如"IDX_",來(lái)防止與數(shù)據(jù)庫(kù)中的其他物件混淆。另外,在索引名之內(nèi)包括表格名及欄位名也是一個(gè)好的方式。請(qǐng)讀者注意,每個(gè)數(shù)據(jù)庫(kù)會(huì)有它本身的CREATEINDEX語(yǔ)法,而不同數(shù)據(jù)庫(kù)的語(yǔ)法會(huì)有不同。因此,在下指令前,請(qǐng)先由數(shù)據(jù)庫(kù)使用手冊(cè)中確認(rèn)正確的語(yǔ)法。ALTERTABLE在表格被建立在數(shù)據(jù)庫(kù)中后,我們常常會(huì)發(fā)現(xiàn),這個(gè)表格的結(jié)構(gòu)需要有所改變。常見(jiàn)的改變?nèi)缦拢杭右粋€(gè)欄位刪去一個(gè)欄位改變欄位名稱改變欄位的資料種類以上列出的改變并不是所有可能的改變。ALTERTABLE也可以被用來(lái)作其他的改變,例如改變主鍵定義。ALTERTABLE的語(yǔ)法如下:ALTERTABLE"table_name"[改變方式][改變方式]的詳細(xì)寫法會(huì)依我們想要到達(dá)的目標(biāo)而有所不同。再以上列出的改變中,[改變方式]如下:加一個(gè)欄位:ADD"欄位1""欄位1資料種類"刪去一個(gè)欄位:DROP"欄位1"改變欄位名稱:CHANGE"原本欄位名""新欄位名""新欄位名資料種類"改變欄位的資料種類:MODIFY"欄位1""新資料種類"以下我們用在CREATETABLE一頁(yè)建出的customer表格來(lái)當(dāng)作例子:customer表格欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_Datedate第一,我們要參加一個(gè)叫做"gender"的欄位。這可以用以下的指令達(dá)成:ALTERtablecustomeraddGenderchar(1)這個(gè)指令執(zhí)行后的表格架構(gòu)是:customer表格欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_DatedateGenderchar(1)接下來(lái),我們要把"Address"欄位改名為"Addr"。這可以用以下的指令達(dá)成:ALTERtablecustomerchangeAddressAddrchar(50)這個(gè)指令執(zhí)行后的表格架構(gòu)是:customer表格欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addrchar(50)Citychar(50)Countrychar(25)Birth_DatedateGenderchar(1)再來(lái),我們要將"Addr"欄位的資料種類改為char(30)。這可以用以下的指令達(dá)成:ALTERtablecustomermodifyAddrchar(30)這個(gè)指令執(zhí)行后的表格架構(gòu)是:customer表格欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addrchar(30)Citychar(50)Countrychar(25)Birth_DatedateGenderchar(1)最后,我們要?jiǎng)h除"Gender"欄位。這可以用以下的指令達(dá)成:ALTERtablecustomerdropGender這個(gè)指令執(zhí)行后的表格架構(gòu)是:customer表格欄位名稱資料種類First_Namechar(50)Last_Namechar(50)Addrchar(30)Citychar(50)Countrychar(25)Birth_DatedateDROPTABLE有時(shí)候我們會(huì)決定我們需要從數(shù)據(jù)庫(kù)中去除一個(gè)表格。事實(shí)上,如果我們不能這樣做的話,那將會(huì)是一個(gè)很大的問(wèn)題,因?yàn)閿?shù)據(jù)庫(kù)管理師(DatabaseAdministrator--DBA)勢(shì)必?zé)o法對(duì)數(shù)據(jù)庫(kù)做有效率的管理。還好,SQL有提供一個(gè)DROPTABLE的語(yǔ)法來(lái)讓我們?nèi)コ砀瘛ROPTABLE的語(yǔ)法是:DROPTABLE"表格名"我們?nèi)绻コ谏弦豁?yè)中建立的顧客表格,我們就鍵入:DROPTABLEcustomer.TRUNCATETABLE有時(shí)候我們會(huì)需要去除一個(gè)表格中的所有資料。要到達(dá)者個(gè)目的,一種方式是我們?cè)谏弦豁?yè)看到的DROPTABLE指令。不過(guò)這樣整個(gè)表格就消失,而無(wú)法再被用了。另一種方式就是運(yùn)用TRUNCATETABLE的指令。在這個(gè)指令之下,表格中的資料會(huì)完全消失,可是表格本身會(huì)繼續(xù)存在。TRUNCATETABLE的語(yǔ)法為下:TRUNCATETABLE"表格名"所以,我們?nèi)绻コ赟QLCreateTable那一頁(yè)建立的顧客表格之內(nèi)的資料,我們就鍵入:TRUNCATETABLEcustomer.INSERTINTO到目前為止,我們學(xué)到了將如何把資料由表格中取出。但是這些資料是如果進(jìn)入這些表格的呢?這就是這一頁(yè)(INSERTINTO)和下一頁(yè)(UPDATE)要討論的。根本上,我們有兩種作法可以將資料輸入表格中內(nèi)。一種是一次輸入一筆,另一種是一次輸入好幾筆。我們先來(lái)看一次輸入一筆的方式。依照慣例,我們先介紹語(yǔ)法。一次輸入一筆資料的語(yǔ)法如下:INSERTINTO"表格名"("欄位1","欄位2",...)VALUES("值1","值2",...)假設(shè)我們有一個(gè)架構(gòu)如下的表格:Store_Information表格ColumnNameDataTypestore_namechar(50)SalesfloatDatedatetime而我們要加以下的這一筆資料進(jìn)去這個(gè)表格:在January10,1999,LosAngeles店有$900的營(yíng)業(yè)額。我們就打入以下的SQL語(yǔ)句:INSERTINTOStore_Information(store_name,Sales,Date)VALUES('LosAngeles',900,'Jan-10-1999')第二種INSERTINTO能夠讓我們一次輸入多筆的資料。跟上面剛的例子不同的是,現(xiàn)在我們要用SELECT指令來(lái)指明要輸入表格的資料。如果您想說(shuō),這是不是說(shuō)資料是從另一個(gè)表格來(lái)的,那您就想對(duì)了。一次輸入多筆的資料的語(yǔ)法是:INSERTINTO"表格1"("欄位1","欄位2",...)SELECT"欄位3","欄位4",...FROM"表格2"以上的語(yǔ)法是最根本的。這整句SQL也可以含有WHERE、GROUPBY、及HAVING等子句,以及表格連接及別名等等。舉例來(lái)說(shuō),假設(shè)我們想要將1998年的營(yíng)業(yè)額資料放入Store_Information表格,而我們知道資料的來(lái)源是可以由Sales_Information表格取得的話,那我們就可以鍵入以下的SQL:INSERTINTOStore_Information(store_name,Sales,Date)SELECTstore_name,Sales,DateFROMSales_InformationWHEREYear(Date)=1998在這里,我用了SQLServer中的函數(shù)來(lái)由日期中找出年。不同的數(shù)據(jù)庫(kù)會(huì)有不同的語(yǔ)法。舉個(gè)例來(lái)說(shuō),在Oracle上,您將會(huì)使用WHEREto_char(date,'yyyy')=1998。UPDATE我們有時(shí)候可能會(huì)需要修改表格中的資料。在這個(gè)時(shí)候,我們就需要用到UPDATE指令。這個(gè)指令的語(yǔ)法是:UPDATE"表格名"SET"欄位1"=[新值]WHERE{條件}最容易了解這個(gè)語(yǔ)法的方式是透過(guò)一個(gè)例子。假設(shè)我們有以下的表格:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999我們發(fā)現(xiàn)說(shuō)LosAngeles在01/08/1999的營(yíng)業(yè)額實(shí)際上是$500,而不是表格中所儲(chǔ)存的$300,因此我們用以下的SQL來(lái)修改那一筆資料:UPDATEStore_InformationSETSales=500WHEREstore_name="LosAngeles"ANDDate="Jan-08-1999"現(xiàn)在表格的內(nèi)容變成:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$500Jan-08-1999Boston$700Jan-08-1999在這個(gè)例子中,只有一筆資料符合WHERE子句中的條件。如果有多筆資料符合條件的話,每一筆符合條件的資料都會(huì)被修改的。我們也可以同時(shí)修改好幾個(gè)欄位。這語(yǔ)法如下:UPDATE"表格"SET"欄位1"=[值1],"欄位2"=[值2]WHERE{條件}DELETEFROM在某些情況下,我們會(huì)需要直接由數(shù)據(jù)庫(kù)中去除一些資料。這可以藉由DELETEFROM指令來(lái)達(dá)成。它的語(yǔ)法是:DELETEFROM"表格名"WHERE{條件}以下我們用個(gè)實(shí)例說(shuō)明。假設(shè)我們有以下這個(gè)表格:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999而我們需要將有關(guān)LosAngeles的資料全部去除。在這里我們可以用以下的SQL來(lái)到達(dá)這個(gè)目的:DELETEFROMStore_InformationWHEREstore_name="LosAngeles"現(xiàn)在表格的內(nèi)容變成:Store_Information表格store_nameSalesDateSanDiego$250Jan-07-1999Boston$700Jan-08-1999進(jìn)階SQL在這一局部,我們將介紹以下的SQL概念及關(guān)鍵字:SQLUNIONSQLUNIONALLSQLINTERSECTSQLMINUSSQLSubquerySQLEXISTSSQLCASE我們并介紹如何用SQL來(lái)做出以下的運(yùn)算:排名(Rank)中位數(shù)(Median)累積總計(jì)(RunningTotal)總合百分比(PercenttoTotal)累積總合百分比(CumulativePercenttoTotal)UNIONUNION指令的目的是將兩個(gè)SQL語(yǔ)句的結(jié)果合并起來(lái)。從這個(gè)角度來(lái)看,UNION跟JOIN有些許類似,因?yàn)檫@兩個(gè)指令都可以由多個(gè)表格中擷取資料。UNION的一個(gè)限制是兩個(gè)SQL語(yǔ)句所產(chǎn)生的欄位需要是同樣的資料種類。另外,當(dāng)我們用UNION這個(gè)指令時(shí),我們只會(huì)看到不同的資料值(類似SELECTDISTINCT)。UNION的語(yǔ)法如下:[SQL語(yǔ)句1]UNION[SQL語(yǔ)句2]假設(shè)我們有以下的兩個(gè)表格,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Internet_Sales表格DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750而我們要找出來(lái)所有有營(yíng)業(yè)額(sales)的日子。要到達(dá)這個(gè)目的,我們用以下的SQL語(yǔ)句:SELECTDateFROMStore_InformationUNIONSELECTDateFROMInternet_Sales結(jié)果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-10-1999Jan-11-1999Jan-12-1999有一點(diǎn)值得注意的是,如果我們?cè)谌魏我粋€(gè)SQL語(yǔ)句(或是兩句都一起)用"SELECTDISTINCTDate"的話,那我們會(huì)得到完全一樣的結(jié)果。UNIONALLUNIONALL這個(gè)指令的目的也是要將兩個(gè)SQL語(yǔ)句的結(jié)果合并在一起。UNIONALL和UNION不同之處在于UNIONALL會(huì)將每一筆符合條件的資料都列出來(lái),無(wú)論資料值有無(wú)重復(fù)。UNIONALL的語(yǔ)法如下:[SQL語(yǔ)句1]UNIONALL[SQL語(yǔ)句2]我們用和上一頁(yè)同樣的例子來(lái)顯示出UNIONALL和UNION的不同。同樣假設(shè)我們有以下兩個(gè)表格,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Internet_Sales表格DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750而我們要找出有店面營(yíng)業(yè)額以及網(wǎng)絡(luò)營(yíng)業(yè)額的日子。要到達(dá)這個(gè)目的,我們用以下的SQL語(yǔ)句:SELECTDateFROMStore_InformationUNIONALLSELECTDateFROMInternet_Sales結(jié)果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-08-1999Jan-07-1999Jan-10-1999Jan-11-1999Jan-12-1999INTERSECT和UNION指令類似,INTERSECT也是對(duì)兩個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果做處理的。不同的地方是,UNION根本上是一個(gè)OR(如果這個(gè)值存在于第一句或是第二句,它就會(huì)被選出),而INTERSECT那么比擬像AND(這個(gè)值要存在于第一句和第二句才會(huì)被選出)。UNION是聯(lián)集,而INTERSECT是交集。INTERSECT的語(yǔ)法如下:[SQL語(yǔ)句1]INTERSECT[SQL語(yǔ)句2]假設(shè)我們有以下的兩個(gè)表格,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999Internet_Sales表格DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750而我們要找出哪幾天有店面交易和網(wǎng)絡(luò)交易。要到達(dá)這個(gè)目的,我們用以下的SQL語(yǔ)句:SELECTDateFROMStore_InformationINTERSECTSELECTDateFROMInternet_Sales結(jié)果:DateJan-07-1999請(qǐng)注意,在INTERSECT指令下,不同的值只會(huì)被列出一次。MINUSMINUS指令是運(yùn)用在兩個(gè)SQL語(yǔ)句上。它先找出第一個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果,然后看這些結(jié)果有沒(méi)有在第二個(gè)SQL語(yǔ)句的結(jié)果中。如果有的話,那這一筆資料就被去除,而不會(huì)在最后的結(jié)果中出現(xiàn)。如果第二個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果并沒(méi)有存在于第一個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果內(nèi),那這筆資料就被拋棄。MINUS的語(yǔ)法如下:[SQL語(yǔ)句1]MINUS[SQL語(yǔ)句2]我們繼續(xù)使用一樣的例子:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 膠粉基礎(chǔ)知識(shí)
- 吊車吊裝施工方案
- 公共交通系統(tǒng)乘客服務(wù)管理方案
- 建筑施工材料驗(yàn)收規(guī)范與方法
- 干掛石材墻面施工工藝流程與技術(shù)要點(diǎn)
- 大壩施工防護(hù)技術(shù)與方案設(shè)計(jì)
- 電商平臺(tái)用戶體驗(yàn)優(yōu)化方案及效果分析
- 建筑材料力學(xué)性能測(cè)試方法
- 生產(chǎn)車間設(shè)備點(diǎn)檢維護(hù)標(biāo)準(zhǔn)操作
- 幼兒園安全教育主題班會(huì)教案
- 財(cái)務(wù)共享運(yùn)營(yíng)管理制度
- 文物基礎(chǔ)知識(shí)題庫(kù)單選題100道及答案
- 工程項(xiàng)目管理(第二版)丁士昭主編的課后習(xí)題及答案
- 2025年河南省中招理化生實(shí)驗(yàn)操作考試ABCD考場(chǎng)評(píng)分表
- 2024年吉林省高職高專院校單獨(dú)招生統(tǒng)一考試數(shù)學(xué)試題
- 四川省成都市邛崍市2024-2025學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題(含答案)
- 食品行業(yè)停水、停電、停汽時(shí)應(yīng)急預(yù)案
- MEMRS-ECG心電網(wǎng)絡(luò)系統(tǒng)使用說(shuō)明書(shū)
- 美國(guó)變壓器市場(chǎng)深度報(bào)告
- 建設(shè)工程第三方質(zhì)量安全巡查標(biāo)準(zhǔn)
- 乳化液處理操作規(guī)程
評(píng)論
0/150
提交評(píng)論