【正文】
向一個(gè)表中添加了一個(gè)字段,沒有容易的辦法來去除它。使用SELECT INTO 語句,你可以創(chuàng)建該表的一個(gè)拷貝,但不包含要?jiǎng)h除的字段。通過這種方法,你既可以修改表的結(jié)構(gòu),又能保存原有的數(shù)據(jù)。如果你想改變一個(gè)字段的數(shù)據(jù)類型,你可以創(chuàng)建一個(gè)包含正確數(shù)據(jù)類型字段的新表。但是,使用本節(jié)中講述的SQL語句,你可以繞過這兩個(gè)問題。下面的例子只拷貝字段second_columnd的值等于’Copy Me!’的記錄的first_column字段。如果你需要拷貝整個(gè)表,你可以使用SELECT INTO 語句。然而,有一個(gè)方法可以使INSERT 語句一次添加多個(gè)記錄。例如,如果你想把表titles中的所有書的價(jià)格加倍,你可以使用如下的UPDATE 語句:你也可以同時(shí)更新多個(gè)字段。這部分內(nèi)容對(duì)本書來說太高級(jí)了,因此不加討論。請(qǐng)看這個(gè)例子:UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’這個(gè)UPDATE 語句更新所有second_column字段的值為’Update Me!’的記錄。注意:為什么要用TRUNCATE TABLE 語句代替DELETE語句?當(dāng)你使用TRUNCATE TABLE語句時(shí),記錄的刪除是不作記錄的。例如,下面的這個(gè)DELETE語句只刪除字段first_column的值等于’Delete Me’的記錄:DELETE mytable WHERE first_column=’Deltet Me’DELETE 語句的完整句法如下: DELETE [FROM] {table_name|view_name} [WHERE clause]在SQL SELECT 語句中可以使用的任何條件都可以在DELECT 語句的WHERE子句 中使用。Another_first字段用來保存字段first_column的值??紤]如下的SQL語句: INSERT mytable (first_column) VALUES(‘some value’) INSERT anothertable(another_first,another_second) VALUES(identity,’some value’) 如果表mytable有一個(gè)標(biāo)識(shí)字段,該字段的值會(huì)被插入表anothertable的another_first字段?!?如果該字段不能接受空值,而且沒有缺省值,就會(huì)出現(xiàn)錯(cuò)誤。在這種情況下,有下面的四種可能:■ 如果該字段有一個(gè)缺省值,該值會(huì)被使用。但是,如果你需要輸入很長(zhǎng)的字符串,你應(yīng)該使用WRITETEXT語句。將要被插入數(shù)據(jù)的字段的名字在第一個(gè)括號(hào)中指定,實(shí)際的數(shù)據(jù)在第二個(gè)括號(hào)中給出。下面的例子對(duì)firstname和lastname兩個(gè)字段建立索引:CREATE INDEX name_index ON username(firstname,lastname)這個(gè)例子對(duì)兩個(gè)字段建立了單個(gè)索引。對(duì)聚簇索引和非聚簇索引都可以使用這個(gè)關(guān)鍵字。(這里有一個(gè)如何對(duì)一個(gè)表建立聚簇索引的例子:CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)如果表中有重復(fù)的記錄,當(dāng)你試圖用這個(gè)語句建立索引時(shí),會(huì)出現(xiàn)錯(cuò)誤。在這個(gè)例子中,你刪除的索引是mycolumn_index,它是表mytable的索引。索引mycolumn_index對(duì)表mytable的mycolumn字段進(jìn)行。 為了給一個(gè)表建立索引,啟動(dòng)任務(wù)欄SQL Sever程序組中的ISQL/w程序。如果對(duì)一個(gè)字段建立了唯一索引,你將不能向這個(gè)字段輸入重復(fù)的值。這和分別對(duì)兩個(gè)字段建立單獨(dú)的索引是不同的。 這兩種類型的索引都有兩個(gè)重要屬性:你可以用兩者中任一種類型同時(shí)對(duì)多個(gè)字段建立索引(復(fù)合索引);兩種類型的索引都可以指定為唯一索引。每當(dāng)你改變了一個(gè)建立了非聚簇索引的表中的數(shù)據(jù)時(shí),必須同時(shí)更新索引。你可以對(duì)日期時(shí)間字段建立聚簇索引,對(duì)用戶名字段建立非聚簇索引。實(shí)際上,對(duì)每個(gè)表你最多可以建立249個(gè)非聚簇索引。例如,假設(shè)你用一個(gè)表來記錄訪問者在你網(wǎng)點(diǎn)上的活動(dòng)。通常你要對(duì)一個(gè)表按照標(biāo)識(shí)字段建立聚簇索引。例如,它也許同時(shí)有主題索引和作者索引。在非聚簇索引中,葉級(jí)頁(yè)指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯(lián)系。而根頁(yè)所指向的兩個(gè)頁(yè)又分別把記錄分割成更小的部分。這是找到書頁(yè)的非常有效的一種方法。通過隨機(jī)的翻尋,你最終可以到達(dá)正確的頁(yè)碼。例如,要建立一個(gè)聚簇索引。對(duì)一個(gè)較大的表來說,通過加索引,一個(gè)通常要花費(fèi)幾個(gè)小時(shí)來完成的查詢只要幾分鐘就可以完成。你可以一頁(yè)一頁(yè)地逐頁(yè)搜索,但這會(huì)花很多時(shí)間。)4)、為了建立一個(gè)標(biāo)識(shí)字段,你只需在字段定義后面加上表達(dá)式IDENTITY即可。記住,如果你把一個(gè)字符串保存在CHAR型字段中,該字符串會(huì)被追加多余的空格,以匹配該字段的長(zhǎng)度。有兩個(gè)函數(shù),TTRIM()和LTRIM(),可以用來從字符串中剪掉空格。該函數(shù)忽略任何元音字母(包括y),除非一個(gè)元音字母是一個(gè)字符串的第一個(gè)字母。下面是這個(gè)查詢的結(jié)果:site name sounds like……………………………………………………………….Yahoo Y000Mahoo M000Microsoft M262Macrosoft M262Minisoft M521Microshoft M262Zicrosoft Z262Zaposoft Z121Millisoft M421Nanosoft N521Megasoft M221Picosoft P221(12 row(s) affected)如果你仔細(xì)看一下音標(biāo)碼,你會(huì)注意到音標(biāo)碼的第一個(gè)字母與字段值的第一個(gè)字母相同。如果你把上一語句中的大于3改為大于2,那么名為Zicrosoft和Megasoft的站點(diǎn)也將被返回。函數(shù)DIFFERENCE()返回一個(gè)0到4之間的數(shù)字。函數(shù)SOUNDEX()給一個(gè)字符串分配一個(gè)音標(biāo)碼,函數(shù)DIFFERENCE()按照發(fā)音比較兩個(gè)字符串。注意:如果你想匹配百分號(hào)或下劃線字符本身,你需要把它們括在方括號(hào)中。最后,通過使用下劃線字符(_),你可以匹配任何單個(gè)字符。通過在括號(hào)內(nèi)的表達(dá)式中同時(shí)包含一個(gè)范圍和一些指定的字符,你可以把這兩種方法結(jié)合起來。要得到第二頁(yè)中顯示的站點(diǎn),應(yīng)使用這個(gè)語句:SELECT site_name FROM site_directory WHERE site_name LIKE ‘[NZ]%’在這個(gè)例子中,括號(hào)中的表達(dá)式代表任何處在N到Z之間的單個(gè)字符。在第一頁(yè),你想顯示所有首字母在A到M之間的站點(diǎn)。它代表0個(gè)或多個(gè)字符。描述為We have the greatest collection of trading cards in the world!的站點(diǎn)也被返回。例如,一個(gè)描述為We have the greatest collection of trading cards in the world!的站點(diǎn)不會(huì)被返回。你可以建立一個(gè)表用來保存一系列的站點(diǎn)名稱,統(tǒng)一資源定位器(URL),描述,和類別,并允許訪問者通過在HTML form中輸入關(guān)鍵字來檢索這些內(nèi)容。當(dāng)向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串時(shí),你需要進(jìn)行同樣的轉(zhuǎn)換操作。第一個(gè)變量指定了數(shù)據(jù)類型和長(zhǎng)度。SQL Sever會(huì)為你完成這項(xiàng)工作。你可以使用如下的SELECT 語句:SELECT vote FROM opinion WHERE username IN (‘Bill Gates’,’President Clinton’)最后,你可以在使用BETWEEN或IN的同時(shí)使用表達(dá)式NOT。使用如下的SELECT可以得到相同的結(jié)果:SELECT username FROM opinion WHERE vote IN (1,10)注意表達(dá)式IN 的使用。使用哪一種語句是編程風(fēng)格的問題,但你會(huì)發(fā)現(xiàn)使用表達(dá)式BETWEEN 的語句更易讀。通過匹配一定范圍的值來取出數(shù)據(jù)假設(shè)你有一個(gè)表用來保存對(duì)你的站點(diǎn)進(jìn)行民意調(diào)查的結(jié)果。如果字段是空的,函數(shù)MIN()返回空值。如果你想知道訪問者對(duì)你站點(diǎn)的最高評(píng)價(jià),你可以使用如下的語句:SELECT MAX(vote) FROM opinion你也許希望有人對(duì)你的站點(diǎn)給予了很高的評(píng)價(jià)。要計(jì)算所有定購(gòu)量的總和,你可以使用函數(shù)SUM():SELECT SUM(purchase_amount) FROM orders函數(shù)SUM()的返回值代表字段purchase_amount中所有值的平均值。函數(shù)AVG()只能對(duì)數(shù)值型字段使用。假如你對(duì)你的站點(diǎn)進(jìn)行一次較為復(fù)雜的民意調(diào)查。0表示反對(duì)票,1表示贊成票。因此,你不需要指定要被計(jì)算的特定字段。一般來說,這正是你所希望的。你可以通過使用關(guān)鍵字DISTINCT來得到該數(shù)目。如果相同的名字出現(xiàn)了不止一次,該名