【正文】
60。Like M[^c]% 返回以M開始且第二個(gè)字符不是c的任意字符串。到現(xiàn)在為止,你只學(xué)習(xí)了如何根據(jù)特定的條件從表中取出一條或多條記錄。但是,假如你想對(duì)一個(gè)表中的記錄進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。例如,如果你想統(tǒng)計(jì)存儲(chǔ)在表中的一次民意測(cè)驗(yàn)的投票結(jié)果?;蛘吣阆胫酪粋€(gè)訪問(wèn)者在你的站點(diǎn)上平均花費(fèi)了多少時(shí)間。要對(duì)表中的任何類型的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),都需要使用集合函數(shù)。Microsoft SQL 支持五種類型的集合函數(shù)。你可以統(tǒng)計(jì)記錄數(shù)目,平均值,最小值,最大值,或者求和。當(dāng)你使用一個(gè)集合函數(shù)時(shí),它只返回一個(gè)數(shù),該數(shù)值代表這幾個(gè)統(tǒng)計(jì)值之一。注意:要在你的ASP網(wǎng)頁(yè)中使用集合函數(shù)的返回值,你需要給該值起一個(gè)名字。要作到這一點(diǎn),你可以在SELECT語(yǔ)句中,在集合函數(shù)后面緊跟一個(gè)字段名,如下例所示:SELECT AVG(vote) ‘the_average’ FROM opinion在這個(gè)例子中,vote的平均值被命名為 the_average?,F(xiàn)在你可以在你的ASP網(wǎng)頁(yè)的數(shù)據(jù)庫(kù)方法中使用這個(gè)名字。函數(shù)COUNT()也許是最有用的集合函數(shù)。你可以用這個(gè)函數(shù)來(lái)統(tǒng)計(jì)一個(gè)表中有多少條記錄。這里有一個(gè)例子:SELECT COUNT(au_lname) FROM authors這個(gè)例子計(jì)算表authors中名字(last name)的數(shù)目。如果相同的名字出現(xiàn)了不止一次,該名字將會(huì)被計(jì)算多次。如果你想知道名字為某個(gè)特定值的作者有多少個(gè),你可以使用WHERE子句,如下例所示:SELECT COUNT(au_lname) FROM authors WHERE au_lname=’Ringer’這個(gè)例子返回名字為’Ringer’的作者的數(shù)目。如果這個(gè)名字在表authors中出現(xiàn)了兩次,則次函數(shù)的返回值是2。假如你想知道有不同名字的作者的數(shù)目。你可以通過(guò)使用關(guān)鍵字DISTINCT來(lái)得到該數(shù)目。如下例所示:SELECT COUNT(DISTINCT au_lname) FROM authors如果名字’Ringer’出現(xiàn)了不止一次,它將只被計(jì)算一次。關(guān)鍵字DISTINCT 決定了只有互不相同的值才被計(jì)算。通常,當(dāng)你使用COUNT()時(shí),字段中的空值將被忽略。一般來(lái)說(shuō),這正是你所希望的。但是,如果你僅僅想知道表中記錄的數(shù)目,那么你需要計(jì)算表中所有的記錄─不管它是否包含空值。下面是一個(gè)如何做到這一點(diǎn)的例子:SELECT COUNT(*) FROM authors注意函數(shù)COUNT()沒(méi)有指定任何字段。這個(gè)語(yǔ)句計(jì)算表中所有記錄所數(shù)目,包括有空值的記錄。因此,你不需要指定要被計(jì)算的特定字段。函數(shù)COUNT()在很多不同情況下是有用的。例如,假設(shè)有一個(gè)表保存了對(duì)你站點(diǎn)的質(zhì)量進(jìn)行民意調(diào)查的結(jié)果。這個(gè)表有一個(gè)名為vote的字段,該字段的值要么是0,要么是1。0表示反對(duì)票,1表示贊成票。要確定贊成票的數(shù)量,你可以所有下面的SELECT 語(yǔ)句:SELECT COUNT(vote) FROM opinion_table WHERE vote=1使用函數(shù)COUNT(),你可以統(tǒng)計(jì)一個(gè)字段中有多少個(gè)值。但有時(shí)你需要計(jì)算這些值的平均值。使用函數(shù)AVG(),你可以返回一個(gè)字段中所有值的平均值。假如你對(duì)你的站點(diǎn)進(jìn)行一次較為復(fù)雜的民意調(diào)查。訪問(wèn)者可以在1到10之間投票,表示他們喜歡你站點(diǎn)的程度。你把投票結(jié)果保存在名為vote的INT型字段中。要計(jì)算你的用戶投票的平均值,你需要使用函數(shù)AVG():SELECT AVG(vote) FROM opinion這個(gè)SELECT語(yǔ)句的返回值代表用戶對(duì)你站點(diǎn)的平均喜歡程度。函數(shù)AVG()只能對(duì)數(shù)值型字段使用。這個(gè)函數(shù)在計(jì)算平均值時(shí)也忽略空值。假設(shè)你的站點(diǎn)被用來(lái)出售卡片,已經(jīng)運(yùn)行了兩個(gè)月,是該計(jì)算賺了多少錢的時(shí)候了。假設(shè)有一個(gè)名為orders的表用來(lái)記錄所有訪問(wèn)者的定購(gòu)信息。要計(jì)算所有定購(gòu)量的總和,你可以使用函數(shù)SUM():SELECT SUM(purchase_amount) FROM orders函數(shù)SUM()的返回值代表字段purchase_amount中所有值的平均值。字段purchase_amount的數(shù)據(jù)類型也許是MONEY型,但你也可以對(duì)其它數(shù)值型字段使用函數(shù)SUM()。再一次假設(shè)你有一個(gè)表用來(lái)保存對(duì)你的站點(diǎn)進(jìn)行民意調(diào)查的結(jié)果。訪問(wèn)者可以選擇從1到10 的值來(lái)表示他們對(duì)你站點(diǎn)的評(píng)價(jià)。如果你想知道訪問(wèn)者對(duì)你站點(diǎn)的最高評(píng)價(jià),你可以使用如下的語(yǔ)句:SELECT MAX(vote) FROM opinion你也許希望有人對(duì)你的站點(diǎn)給予了很高的評(píng)價(jià)。通過(guò)函數(shù)MAX(),你可以知道一個(gè)數(shù)值型字段的所有值中的最大值。如果有人對(duì)你的站點(diǎn)投了數(shù)字10,函數(shù)MAX()將返回該值。另一方面,假如你想知道訪問(wèn)者對(duì)你站點(diǎn)的的最低評(píng)價(jià),你可以使用函數(shù)MIN(),如下例所示:SELECT MIN(vote) FROM opinion函數(shù)MIN()返回一個(gè)字段的所有值中的最小值。如果字段是空的,函數(shù)MIN()返回空值。、函數(shù)、過(guò)程這一節(jié)將介紹一些其它的SQL技術(shù)。你將學(xué)習(xí)如何從表中取出數(shù)據(jù),其某個(gè)字段的值處在一定的范圍,你還將學(xué)習(xí)如何把字段值從一種類型轉(zhuǎn)換成另一種類型,如何操作字符串和日期時(shí)間數(shù)據(jù)。最后,你將學(xué)會(huì)一個(gè)發(fā)送郵件的簡(jiǎn)單方法。通過(guò)匹配一定范圍的值來(lái)取出數(shù)據(jù)假設(shè)你有一個(gè)表用來(lái)保存對(duì)你的站點(diǎn)進(jìn)行民意調(diào)查的結(jié)果?,F(xiàn)在你想向所有對(duì)你的站點(diǎn)的評(píng)價(jià)在7到10之間的訪問(wèn)者發(fā)送書面的感謝信。要得到這些人的名字,你可以使用如下的SELECT 語(yǔ)句:SELECT username FROM opinion WHERE vote6 and vote11這個(gè)SELECT 語(yǔ)句會(huì)實(shí)現(xiàn)你的要求。你使用下面的SELECT 語(yǔ)句也可以得到同樣的結(jié)果:SELECT username FROM opinion WHERE vote BETWEEN 7 AND 10這個(gè)SELECT 語(yǔ)句與上一個(gè)語(yǔ)句是等價(jià)的。使用哪一種語(yǔ)句是編程風(fēng)格的問(wèn)題,但你會(huì)發(fā)現(xiàn)使用表達(dá)式BETWEEN 的語(yǔ)句更易讀?,F(xiàn)在假設(shè)你只想取出對(duì)你的站點(diǎn)投了1或者10的訪問(wèn)者的名字。要從表opinion中取出這些名字,你可以使用如下的SELECT 語(yǔ)句:SELECT username FROM opinion WHERE vote=1 or vote 這個(gè)SELECT語(yǔ)句會(huì)返回正確的結(jié)果,沒(méi)有理由不使用它。但是,存在一種等價(jià)的方式。使用如下的SELECT可以得到相同的結(jié)果:SELECT username FROM opinion WHERE vote IN (1,10)注意表達(dá)式IN 的使用。這個(gè)SELECT 語(yǔ)句只取出vote的值等于括號(hào)中的值之一的記錄。你也可以使用IN來(lái)匹配字符數(shù)據(jù)。例如,假設(shè)你只想取出Bill Gates或President Clinton的投票值。你可以使用如下的SELECT 語(yǔ)句:SELECT vote FROM opinion WHERE username IN (‘Bill Gates’,’President Clinton’)最后,你可以在使用BETWEEN或IN的同時(shí)使用表達(dá)式NOT。例如,要取出那些投票值不在7到10之間的人的名字,你可以使用如下的SELECT 語(yǔ)句:SELECT username FROM opinion WHERE vote NOT BETWEEN 7 and 10要選取那些某個(gè)字段的值不在一列值之中的記錄,你可以同時(shí)使用NOT 和IN,如下例所示:SELECT vote FROM opinion WHERE username NOT IN (‘Bill Gates’,’President Clinton’)你不是必須在SQL語(yǔ)句中使用BETWEEN或IN,但是,要使你的查詢更接近自然語(yǔ)言,這兩個(gè)表達(dá)式是有幫助的。SQL Sever足夠強(qiáng)大,可以在需要的時(shí)候把大部分?jǐn)?shù)值從一種類型轉(zhuǎn)換為另一種類型。例如,要比較SMALLINT型和INT型數(shù)據(jù)的大小,你不需要進(jìn)行顯式的類型轉(zhuǎn)換。SQL Sever會(huì)為你完成這項(xiàng)工作。但是,當(dāng)你想在字符型數(shù)據(jù)和其它類型的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換時(shí),你的確需要自己進(jìn)行轉(zhuǎn)換操作。例如,假設(shè)你想從一個(gè)MONEY型字段中取出所有的值,并在結(jié)果后面加上字符串“US Dollars”。你需要使用函數(shù)CONVERT(),如下例所示:SELECT CONVERT(CHAR(8),price)+’US Dollars’ FROM orders函數(shù)CONVERT()帶有兩個(gè)變量。第一個(gè)變量指定了數(shù)據(jù)類型和長(zhǎng)度。第二個(gè)變量指定了要進(jìn)行轉(zhuǎn)換的字段。在這個(gè)例子中,字段price被轉(zhuǎn)換成長(zhǎng)度為8個(gè)字符的CHAR型字段。字段price要被轉(zhuǎn)換成字符型,才可以在它后面連接上字符串’US Dollars’。當(dāng)向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串時(shí),你需要進(jìn)行同樣的轉(zhuǎn)換操作。例如,下面的語(yǔ)句在一個(gè)SELECT語(yǔ)句的查詢結(jié)果中加入字符串’The vote is’,該SELECT語(yǔ)句返回一個(gè)BIT型字段的值:SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion下面是這個(gè)語(yǔ)句的結(jié)果示例:The vote is 1The vote is 1The vote is 0(3 row(s) affected)如果你不進(jìn)行顯式的轉(zhuǎn)換,你會(huì)收到如下的錯(cuò)誤信息:Implicit conversion from datatype ‘varchar’ to ‘bit’ is not allowec.Use the CONVERT function to run this query.SQL Sever有許多函數(shù)和表達(dá)式,使你能對(duì)字符串進(jìn)行有趣的操作,包括各種各樣的模式匹