




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQL基礎(chǔ)知識(shí)
本部分內(nèi)容
■SQL基礎(chǔ)
■中級(jí)SQL
■高級(jí)SQL
第10章SQL基礎(chǔ)
本章內(nèi)容
SQL介紹
使用SELECT語(yǔ)句從表中取數(shù)據(jù)
創(chuàng)建新表
字段屬性
向表中添加數(shù)據(jù)
刪除與修改表
為了建立交互站點(diǎn),你需要使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)來(lái)自訪問(wèn)者昌信息。比如,你要建立i個(gè)
職業(yè)介紹服務(wù)的站點(diǎn),你就需要存儲(chǔ)諸如個(gè)人簡(jiǎn)歷,所感興趣的工作等等這樣的信息。創(chuàng)建
動(dòng)態(tài)網(wǎng)葉也需要使用數(shù)據(jù)庫(kù),假如你想顯示符合來(lái)訪者要求的最好的工作,你就需要從數(shù)據(jù)
庫(kù)中取出這份工作的信息。你將會(huì)發(fā)現(xiàn),在許多情況下需要使用數(shù)據(jù)庫(kù)。
在這一章里,你將學(xué)會(huì)如何使用“結(jié)構(gòu)化查詢語(yǔ)言”(SQL:來(lái)操作數(shù)據(jù)庫(kù)。SQL語(yǔ)言是
數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。在AclivcSeverPages中,不管何時(shí)你要訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),你就要使
用SQL語(yǔ)言。因此,掌握好SQL對(duì)ASP編程是非常重要的。
注意:
你能夠把“SQL”讀作“sequel",也能夠按單個(gè)字母的讀音讀作S-Q-Lo
兩種發(fā)音都是正確的,每種發(fā)音各有大量的支持者。在本書(shū)里,認(rèn)為“SQL”讀作“sequel”。
通過(guò)這一章的學(xué)習(xí),你將懂得如何用SQL實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢,你將學(xué)會(huì)如何使用這種查詢
從數(shù)據(jù)表中取出信息,最后,你將學(xué)會(huì)如何設(shè)計(jì)與建立自己的數(shù)據(jù)庫(kù)。
注意:
通過(guò)下面幾章對(duì)SQL的介紹,你將對(duì)SQL有足夠的熟悉,從而能夠有效地使用Active
SeverPages(>但是,SQL是一種復(fù)雜的語(yǔ)言,本書(shū)不可能包含它的全部細(xì)節(jié)。耍全面掌握
SQL語(yǔ)言,你需要學(xué)習(xí)在MicrosoftSQLSever中使用SQL。你能夠到鄰近的書(shū)店去買(mǎi)一本
MicrosoftSQLSever6.5。
SQL介紹:
本書(shū)假設(shè)你是在SQL操作MicrosoftSQLSever的數(shù)據(jù)庫(kù)。你也能夠用SQL操作許多
其它類(lèi)型的數(shù)據(jù)庫(kù)。SQL是操作數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。(事實(shí)上,關(guān)于SQL語(yǔ)言有一個(gè)專門(mén)的
ANSI標(biāo)準(zhǔn))
注意:
不要在你的站點(diǎn)上試圖用MicrosoftAccess代替MicrosoftSQLSever0SQLSever
能夠同時(shí)服務(wù)于許多用戶,假如你希望你的站點(diǎn)有較高的訪問(wèn)率,MSAccess是不能勝任的。
在學(xué)習(xí)SQL的細(xì)節(jié)之前,你需要懂得它的兩大特點(diǎn)。??個(gè)特點(diǎn)容易掌握,另一個(gè)掌握起
來(lái)有點(diǎn)困難。
第一個(gè)特點(diǎn)是所有SQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)都存儲(chǔ)在表中。一個(gè)表由行與列構(gòu)成。比如,下
面這個(gè)簡(jiǎn)單的表包含name與e-mailaddress:
NameEmailAddress
這個(gè)表有兩列(列也稱之字段,域):Name與EmailAddress.有三行,每?行包含一
組數(shù)據(jù)。一行中的數(shù)據(jù)組合在一起稱之一條記錄。
不管何時(shí)你向表中添加新數(shù)據(jù),你就添加了一條新記錄。一個(gè)數(shù)據(jù)表能夠有幾十個(gè)記錄,
也能夠有幾干甚至幾十億個(gè)記錄。盡管你也許永遠(yuǎn)不需要存儲(chǔ)十億個(gè)Email地址,但明白你
能這樣做總是好的,也許有一天你會(huì)有這樣的需要。
你的數(shù)據(jù)庫(kù)很有可能包含幾十個(gè)表,所有存儲(chǔ)在你數(shù)據(jù)庫(kù)中的信息都被存儲(chǔ)在這些表
中。當(dāng)你考慮如何把信息存儲(chǔ)在數(shù)據(jù)庫(kù)中時(shí),你應(yīng)該考慮如何壬它們存儲(chǔ)在表中。
SQL的第二個(gè)特點(diǎn)有些難于掌握。這種語(yǔ)言被設(shè)計(jì)為不同意你按照某種特定的順序來(lái)取
出記錄,由于這樣做會(huì)降低SQLSever取記錄的效率。使用SQL,你只能按查詢條件來(lái)讀取
記錄。
當(dāng)考慮如何從表中取出記錄時(shí),自然會(huì)想到按記錄的位置讀取它們。比如,也許你會(huì)嘗
試通過(guò)一個(gè)循環(huán),逐個(gè)記錄地掃描,來(lái)選出特定的記錄。在使用SQL時(shí),你務(wù)必訓(xùn)練自己,
不要有這種思路。
假如你想選出所有的名字是“BillGates”的記錄,假如僅用傳統(tǒng)的編程語(yǔ)言,你也許
會(huì)構(gòu)造一個(gè)循環(huán),逐個(gè)查看表中的記錄,看名字域是否是“Bi」Gates”。
這種選擇記錄的方法是可行的,但是效率不高。使用SQL.你只要說(shuō),“選擇所有名字
域等于BillGates的記錄”,SQL就會(huì)為你選出所有符合條件的記錄。SQL會(huì)確定實(shí)現(xiàn)查詢
的最佳方法。
建設(shè)你想取出表中的前十個(gè)記錄。使用傳統(tǒng)的編程語(yǔ)言,你能夠做一個(gè)循環(huán),取出前十
個(gè)記錄后結(jié)束循環(huán)。但使用標(biāo)準(zhǔn)的SQL查詢,這是不可能實(shí)現(xiàn)的。從SQL的角度來(lái)說(shuō),在一
個(gè)表中不存在前十個(gè)記錄這種概念。
開(kāi)始時(shí),當(dāng)你明白你不能用SQL實(shí)現(xiàn)某些你感受應(yīng)該能實(shí)現(xiàn)的功能,你會(huì)受到挫折。你
也許會(huì)以頭撞地甚至想寫(xiě)惡毒的信件給SQL的設(shè)計(jì)者們。但后來(lái)你會(huì)認(rèn)識(shí)到,SQL的這個(gè)特
點(diǎn)不僅不是個(gè)限制,反而是其長(zhǎng)處。由于SQL不根據(jù)位置來(lái)讀取記錄,它讀取記錄能夠很快。
綜上所述,SQL有兩個(gè)特點(diǎn):所有數(shù)據(jù)存儲(chǔ)在表中,從SQL的角度來(lái)說(shuō),表中的記錄沒(méi)
有順序。在下一節(jié),你將學(xué)會(huì)如何用SQL從表中選擇特殊的記錄。
使用SQL從表中取記錄。
SQL的要緊功能之一是實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢。假如你熟悉Inlcrncl引擎,那么你已經(jīng)熟悉
查詢了。你使用查詢來(lái)取得滿足特定條件的信息。比如,假如你想找到有ASP信息的全部站
點(diǎn),你能夠連接到Y(jié)ahoo!并執(zhí)行一個(gè)對(duì)ActiveSeverPages的搜索。在你輸入這個(gè)查詢后,
你會(huì)收到一個(gè)列表,表中包含所有其描述中包含搜索表達(dá)式的站點(diǎn)。
多數(shù)Internet引擎同意邏輯查詢。在邏輯查詢中,你能夠包含特殊的運(yùn)算符如AND、
OR與)JOT,你使用這些運(yùn)算符來(lái)選擇特定的記錄。比如,你能夠用AM)來(lái)限制杳詢結(jié)果。假
如你執(zhí)行一個(gè)對(duì)ActiveSeverPagesANDSQL的搜索。你將得到其描述中同時(shí)包含Active
SeverPages與SQL的記錄。當(dāng)你需要限制查詢結(jié)果時(shí),你能夠使用AND。
假如你需要擴(kuò)展查詢的結(jié)果,你能夠使用邏輯操作符OR。比如,假如你執(zhí)行一個(gè)搜索,
搜索所有的其描述中包含ActiveSeverPagesORSQL的站點(diǎn),你收到的列表中將包含所
有其描述中同時(shí)包含兩個(gè)表達(dá)式或者其中任何一個(gè)表達(dá)式的站點(diǎn)。
假如你想從搜索結(jié)果中排除特定的站點(diǎn),你能夠使用NOT。比如,杳詢“ActiveSever
Pages"ANDNOT“SQL”將返回一個(gè)列表,列表中的站點(diǎn)包含ActiveSeverPages,但
不包含SQL。當(dāng)務(wù)必排除特定的記錄時(shí),你能夠使用NOT。
用SQL執(zhí)行的查詢與用Internet搜索引擎執(zhí)行的搜索非常相似。當(dāng)你執(zhí)行一個(gè)SQL
查詢時(shí),通過(guò)使用包含邏輯運(yùn)算符的查詢條件,你能夠得到一個(gè)記錄列表。如今查詢結(jié)果是
來(lái)自一個(gè)或者多個(gè)表。
SQL查詢的句法非常簡(jiǎn)單,假設(shè)有一個(gè)名為email_table的表,包含名字與地址兩個(gè)字
段,要得到BillGates的ejnail地址,你能夠使用下面的查詢:
SELECTemai1fromemailtableWHEREname=*Bi11Gates”
當(dāng)這個(gè)杏詢執(zhí)行時(shí),就從名為email_table的表中讀取BillGates的e_mail地址。
這個(gè)簡(jiǎn)單的語(yǔ)句包含三部分:
■SELECTT語(yǔ)句的第二部份指明要從哪個(gè)(些)表中查詢數(shù)據(jù)。在此例中,要查詢的
表名為email_table。
■最后,SELECT語(yǔ)句的WHERE子句指明要選擇滿足什么條件的記錄。在此例中,查
詢條件為只有name列的值為Bi]1Gates的記錄才被選取。
BillGates很有可能擁有不止一個(gè)email地址。假如表中包含BillGates的多個(gè)email
地址。用上述的SEI.ECT語(yǔ)句能夠讀取他所有的email地址。SELECT語(yǔ)句從表中取出所有name
字段值為BillGates的記錄的email字段的值。
前面說(shuō)過(guò),查詢能夠在查詢條件中包含邏輯運(yùn)算符。假如你想讀取BillGates或者
Clinton總統(tǒng)的所有email地址,你能夠使用下面的查詢語(yǔ)句:
SELECTemailFROMemail_tableWHEREname=*BillGates"OR
name="presidentClinton”
此例中的查詢條件比前一個(gè)復(fù)雜了一點(diǎn)。這個(gè)語(yǔ)句從表email_table中選出所有name
列為BillGates或者presidentClinton的記錄。假如表中含有BillGates或者president
Clinton的多個(gè)地址,所有的地址都被讀取。
SELECT語(yǔ)句的結(jié)構(gòu)在起來(lái)很直觀。假如你請(qǐng)一個(gè)朋友從一個(gè)表中為你選擇一一組記錄,
你也許以非常相似的方式提出你的要求。在SQLSELECT語(yǔ)句中,你"SELECT特定的列FROM
一個(gè)表WHERE某些列滿足一個(gè)特定的條件”。
下一節(jié)將介紹如何執(zhí)行SQL查詢來(lái)選取記錄。這將幫助你熟悉用SELECT語(yǔ)句從表中取
數(shù)據(jù)的各類(lèi)不一致方法。
使用1SQL執(zhí)行SELECT查詢
當(dāng)你安裝SQLSever時(shí),你同時(shí)安裝了一個(gè)叫作ISQL/w的應(yīng)用程序。ISQL/w同意你執(zhí)
行交互的SQL查詢。在把查詢包含到你的ASP網(wǎng)頁(yè)中之前,用ISQL/w對(duì)其進(jìn)行測(cè)試是非常
有用的。
注意:
在這本書(shū)的第一部份,你學(xué)習(xí)了如何安裝與配置MicrosoftSQLSever。假如沒(méi)有安
裝SQLSever或者者SQLSever不能運(yùn)行,請(qǐng)參閱第三章“安裝與使用SQLSever”。
選擇任務(wù)上SQLSever程序組中的ISQL_w以啟動(dòng)該程序。程序啟動(dòng)時(shí),首先會(huì)出現(xiàn)一
個(gè)對(duì)話框,要求輸入服務(wù)器信息與登錄信息(見(jiàn)圖10.Do在Sever框中,輸入你的SQL服
務(wù)器的名字。假如服務(wù)器正運(yùn)行在本地計(jì)算機(jī)上,服務(wù)器名字就是你計(jì)算機(jī)的名字。在登錄
信息框中,輸入一個(gè)登錄帳號(hào)與密碼或者選擇使用“可信連接”,然后單擊Connect按鈕。
圖10。1
注意:
假如你將SQLSever配置為使用完整安全或者混合安全,那么你能夠使用可信連接。假
如你使用標(biāo)準(zhǔn)安全,你則需要提供用戶帳號(hào)與密碼。要熟悉更多信息,參見(jiàn)第三章。
假如一切正常,在你單擊連接按鈕后會(huì)出現(xiàn)一個(gè)查詢窗口,如圖10.2所示。(假如有特
殊,請(qǐng)參考第三章)
圖10.2
在執(zhí)行查詢之前,你需要選擇數(shù)據(jù)庫(kù)。安裝SQLSever時(shí)你已為自己創(chuàng)建了?個(gè)數(shù)據(jù)
庫(kù),SQLSever還有許多系統(tǒng)數(shù)據(jù)庫(kù),如master,model,msdb,與tempdb。
方便的是,SQLSever帶有一個(gè)特殊的名為pubs的例子數(shù)據(jù)庫(kù)。庫(kù)pubs中包含供一個(gè)
虛擬的出版商使用的各個(gè)表。文檔中所有的例子程序都是針對(duì)這個(gè)庫(kù)來(lái)設(shè)計(jì)的。本書(shū)中的許
多例子也使用這個(gè)數(shù)據(jù)庫(kù)。
在查詢窗口頂部的DB卜.拉框中選擇數(shù)據(jù)庫(kù)pubs,這樣你就選擇了數(shù)據(jù)庫(kù)。你所有的查
詢都將針對(duì)這個(gè)庫(kù)中的各個(gè)表來(lái)執(zhí)行。現(xiàn)在你能夠執(zhí)行你的第?個(gè)查詢了。這真讓人興奮!
你的第一個(gè)查詢將針對(duì)一個(gè)名為autrors的表,表中包含所有為某個(gè)虛擬出版商工作的
作者的有關(guān)數(shù)據(jù)。單擊查詢窗口并輸入卜.列的語(yǔ)句:
SELECTphoneFROMauthorsWHEREau_name="Ringer”
輸入完成后,單擊執(zhí)行查詢按鈕(一個(gè)綠色三角形,看起來(lái)像VCR播放鍵)。單擊此按
鈕后,任何出現(xiàn)在查詢窗口中的語(yǔ)句均會(huì)被執(zhí)行。查詢窗口會(huì)自動(dòng)變成結(jié)果顯示窗口,你能
夠看到查詢的結(jié)果(見(jiàn)圖10.3)o
你看到的查詢結(jié)果也許與圖10.3所示的不一致。在SQLSever的不一致版本中,庫(kù)pubs
中的數(shù)據(jù)會(huì)是完全不一致的。對(duì)SQLSever6.5來(lái)說(shuō),將會(huì)找到兩條記錄。結(jié)果顯示窗口中
應(yīng)顯示如下內(nèi)容:
phone
8018260752
801826_0752
(2row(s)affected)
圖10.3
你所執(zhí)行的SELECT語(yǔ)句從表authors中取出所有名字為Ringer的作者的電話號(hào)碼。你
通過(guò)在WHERE子句中使用特殊的選擇條件來(lái)限制查詢的結(jié)果。你也能夠忽略選擇條件,從表
中取出所有作者的電話號(hào)碼。要做到這一點(diǎn),單擊Query標(biāo)簽,返回到杳詢窗口,輸入下列
的SELECT語(yǔ)句:
SELECTPhonePROMauthors
這個(gè)查詢執(zhí)行后,會(huì)取出表authors中的所有電話號(hào)碼(沒(méi)有特定的順序)。假如表
authors中包含一百個(gè)電話號(hào)媽,會(huì)有一百個(gè)記錄被取出,假如表中有十億個(gè)電話號(hào)碼,這
十億條記錄都會(huì)被取出(這也許需要一些時(shí)間)。
表authrs的字段包含姓,名字,電話號(hào)碼,地址,城市,州與郵政編碼。通過(guò)在SELECT
語(yǔ)句的第一部份指定它們,你能夠從表中取出任何一個(gè)字段。你能夠在一個(gè)SELECT語(yǔ)句中
一次取出多個(gè)字段,比如:
SELECTau_fname,aulname,phoneFROMauthors
這個(gè)SELECT語(yǔ)句執(zhí)行后,將取出這三個(gè)列的所有值。下面是這個(gè)查詢的結(jié)果的一個(gè)示
例(為了節(jié)約紙張,只顯示查詢結(jié)果的一部分,其余記錄用省略號(hào)代替):
aufnameaulnamephone
JohnsonWhite408496_7223
MarjorieGreen415986_7020
CherylCarson415548_7723
MichaelO'Leary408286_2428
(23row(s)affected)
在SELECT語(yǔ)句中,你需要列出多少個(gè)字段,你就能夠列出多少。不要忘了把字段名用
逗號(hào)隔開(kāi)。你也能夠用星號(hào)(*)從一個(gè)表中取出所有的字段。這里有一個(gè)使用星號(hào)的例子:
SELECT*FROMauthors
這個(gè)SELECT語(yǔ)句執(zhí)行后,表中的所有字段的值都被取出。你會(huì)發(fā)現(xiàn)你將在SQL查詢中
頻繁使用星號(hào)。
技巧:
你能夠使用星號(hào)來(lái)查看一個(gè)表的所有列的名字。要做到這一點(diǎn),只需要在執(zhí)行完SELECT
語(yǔ)句后看一卜查詢結(jié)果的列標(biāo)題。
操作多個(gè)表
到現(xiàn)在為止,你只嘗試了用一句SQL查詢從一個(gè)表中取出數(shù)據(jù)。你也能夠用一個(gè)SELECT
語(yǔ)句同時(shí)從多個(gè)表中取出數(shù)據(jù),只需在SELECT語(yǔ)句的FROM從句中列出要從中取出數(shù)據(jù)的表
名稱即可:
SELECTau_lname,titleFROMauthors,titles
這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),同時(shí)從表authors與表titles中取出數(shù)據(jù)。從表authors
中取出所有的作者名字,從表titles中取出所有的書(shū)名。在ISQL/w程序中執(zhí)行這個(gè)查詢,
看一下查詢結(jié)果。你會(huì)發(fā)現(xiàn)?些驚奇的出乎意料的情況:作者的名字并沒(méi)有與它們所著的書(shū)
相匹配,而是出現(xiàn)了作者名字與書(shū)名的所有可能的組合,這也許不是你所希望見(jiàn)到的。
出了什么差錯(cuò)?問(wèn)題在于你沒(méi)有指明這兩個(gè)表之間的關(guān)系。你沒(méi)有通過(guò)任何方式告訴
SQL如何把表與表關(guān)聯(lián)在一-起,由于不明白如何關(guān)聯(lián)兩個(gè)表,服務(wù)器只能簡(jiǎn)單地返回取自兩
個(gè)表中的記錄的所有可能組合。
要從兩個(gè)表中選出有意義的記錄組合,你需要通過(guò)建立兩表中字段的關(guān)系來(lái)關(guān)聯(lián)兩個(gè)
表。要做到這一點(diǎn)的途徑之?是創(chuàng)建第三個(gè)表,專門(mén)用來(lái)描述另外兩個(gè)表的字段之間的關(guān)系。
表authors有一個(gè)名為au_id的字段,包含有每個(gè)作者的唯一標(biāo)識(shí)。表titles有一個(gè)
名為lilljid的字段,包含每個(gè)書(shū)名的唯一標(biāo)識(shí)。假如你能在字段au_id與字段
之間建立一個(gè)關(guān)系,你就能夠關(guān)聯(lián)這兩個(gè)表。數(shù)據(jù)庫(kù)pubs中有一個(gè)名為titleauthcr的表,
正是用來(lái)完成這個(gè)工作。表中的每個(gè)記錄包含兩個(gè)字段,用來(lái)科表titles與表authors關(guān)
聯(lián)在一起。下面的SELECT語(yǔ)句使用了這三個(gè)表以得到正確的結(jié)果:
SELECTauname,titleFROMauthors,titles,titleauthor
WHEREauthors.au_id=titieauthor.au_id
ANDtitles.title_id=titieauthor.title_id
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行忖,每個(gè)作者都將與正確的書(shū)名相匹配。表titleauthor指明
了表authors與表titles的關(guān)系,它通過(guò)包含分別來(lái)自兩個(gè)表的各一個(gè)字段實(shí)現(xiàn)這一點(diǎn)。
第三個(gè)表的唯一目的是在另外兩個(gè)表的字段之間建立關(guān)系。它本身不包含任何附加數(shù)據(jù)。
注意在這個(gè)例子中字段名是如何書(shū)寫(xiě)的。為了區(qū)別表authors與表titles中相同的字
段名au_id,每個(gè)字段名前面都加上了表名前綴與一個(gè)句號(hào)。名為author.au_id的字段屬
于表authors,名為titleauthor.auid的字段屬于表titleauthor,兩者不可能混淆。
通過(guò)使用第三個(gè)表,你能夠在兩個(gè)表的字段之間建立各類(lèi)類(lèi)型的關(guān)系。比如,一個(gè)作者
也許寫(xiě)了許多不一致的書(shū),或者者一本書(shū)也許由許多不一致的作者共同完成。當(dāng)兩個(gè)表的字
段之間有這種“多對(duì)多”的關(guān)系時(shí),你需要使用第三個(gè)表來(lái)指明這種關(guān)系。
但是,在許多情況下,兩個(gè)表之間的關(guān)系并不復(fù)雜。比圻你需要指明表titles與表
publishers之間的關(guān)系。由「一個(gè)書(shū)名不可能與多個(gè)出版商相匹配,你不需要通過(guò)第三個(gè)
表來(lái)指明這兩個(gè)表之間的關(guān)系。要指明表titles與表publishers之間的關(guān)系,你只要讓這
兩個(gè)表有?個(gè)公共的字段就能夠了。在數(shù)據(jù)庫(kù)pubs中,表titles與表publishers都有一
個(gè)名為pub_id的字段。假如你想得到書(shū)名及其出版商的一個(gè)列表,你能夠使用如下的語(yǔ)句:
SELECTtitle,pubnameFROMtitles,publishers
WHEREtitles,pubid=publishers.pubid
當(dāng)然,假如一本書(shū)是由兩個(gè)出版商聯(lián)合出版的,那么你需要第三個(gè)表來(lái)代表這種關(guān)系。
通常,當(dāng)你予先明白兩個(gè)表的字段間存在“多對(duì)多”關(guān)系時(shí),就使用第三個(gè)表來(lái)關(guān)聯(lián)這
兩個(gè)表。反之,假如兩個(gè)表的字段間只有“一對(duì)一”或者“一對(duì)多”關(guān)系,你能夠使用公共
字段來(lái)關(guān)聯(lián)它門(mén)。
操作字段
通常,當(dāng)你從一個(gè)表中取出字段值時(shí),該值與創(chuàng)建該表時(shí)所定義的字段名聯(lián)系在一起。
假如你從表authors中選擇所有的作者名字,所有的值將會(huì)與字段名au_lname相聯(lián)系。但
是在某些情況下,你需要對(duì)字段名進(jìn)行操作。在SELECT語(yǔ)句中,你能夠在缺省字段名后面
僅跟一個(gè)新名字來(lái)取代它。比如,能夠用一個(gè)更直觀易讀的名字AuthorLastName來(lái)代替
字段名auIname:
SELECTau_Iname"AuthorLastName"FROMauthors
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),來(lái)自字段au_Iname的值會(huì)與"AulhorLastName0相聯(lián)系。
查詢結(jié)果可能是這樣:
AuthorLastName
White
Green
Carson
OTeary
Straight
(23row(s)affected)
注意字段標(biāo)題不再是au」name,而是被AuthorLastName所取代。
你也能夠通過(guò)執(zhí)行運(yùn)算,來(lái)操作從一個(gè)表返回的字段值。比如,假如你想把表titles
中的所有書(shū)的價(jià)格加倍,你能夠使用卜而的SELECT語(yǔ)句:
SELECTprice*2FROMtitles
當(dāng)這個(gè)查詢執(zhí)行時(shí),每本書(shū)的價(jià)格從表中取出時(shí)都會(huì)加倍。但是,通過(guò)這種途徑操作字
段不可能改變存儲(chǔ)在表中的書(shū)價(jià)。對(duì)字段的運(yùn)算只會(huì)影響SELECT語(yǔ)句的輸出,而不可能影
響表中的數(shù)據(jù)。為了同時(shí)顯示書(shū)的原始價(jià)格與漲價(jià)后的新價(jià)格,你能夠使用下面的查詢:
SELECTprice"Originalprice”,price*2*Newprice*FROMtitles
當(dāng)數(shù)據(jù)從表titles中取出時(shí),原始價(jià)格顯示在標(biāo)題Originalprice下面,加倍后的價(jià)
格顯示在標(biāo)題Newprice下面。結(jié)果可能是這樣:
originalpricenewprice
19.9939.98
11.9523.90
2.995.98
19.9939.98
(18row(s)affected)
你能夠使用大多數(shù)標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算符來(lái)操作字段值,如加(+),減(-),乘(*)與除
</)o你也能夠一次對(duì)多個(gè)字段進(jìn)行運(yùn)算,比如:
SELECTprice*ytd_sales"totalrevenue"FROMtitles
在這個(gè)例子中,通過(guò)把價(jià)格與銷(xiāo)售量相乘,計(jì)算出了每種書(shū)的總銷(xiāo)售額。這個(gè)SELECT
語(yǔ)句的結(jié)果將是這樣的:
totalrevenue
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68
(18row(s)affected)
最后,你還能夠使用連接運(yùn)算符(它看起來(lái)像個(gè)加號(hào))來(lái)連接兩個(gè)字符型字段:
SELECTau_fname+*"+au_lname“authorname"FROMauthors
在這個(gè)例子中,你把字段au_fname與字段au」name粘貼在一起,中間用一個(gè)逗號(hào)隔
開(kāi),并把查詢結(jié)果的標(biāo)題指定為authorname。這個(gè)語(yǔ)句的執(zhí)行結(jié)果將是這樣的:
authornames
JohnsonWhite
MarjorieGreen
CherylCarson
MichaelO'Leary
DeanStraight
(23row(s)affected)
能夠看到,SQL為你提供了對(duì)杳詢結(jié)果的許多操縱。你應(yīng)該在ASP編程過(guò)程中充分利用
這些優(yōu)點(diǎn)。使用SQL來(lái)操作查詢結(jié)果幾乎總是比使用有同樣作用的腳本效率更高。
排序查詢結(jié)果
本章的介紹中曾強(qiáng)調(diào)過(guò),SQL表沒(méi)有內(nèi)在的順序。比如,從一個(gè)表中取第二個(gè)記錄是沒(méi)
有意義的。從SQL的角度看來(lái),沒(méi)有一個(gè)記錄在任何其他記錄之前。
然而,你能夠操縱一個(gè)SQL查詢結(jié)果的順序。在缺省情況下,當(dāng)記錄從表中取出時(shí),記錄不
以特定的順序出現(xiàn)。比如,當(dāng)從表authors中取出字段auInane時(shí),查詢結(jié)果顯示成這樣:
aulname
White
Green
Carson
O,Leary
Straight
(23row(s)affected)
看一列沒(méi)有特定順序的名字是很不方便的。假如把這些名字按字母順序排列,讀起來(lái)就
會(huì)容易得多。通過(guò)使用ORDERBY子句,你能夠強(qiáng)制一個(gè)查詢結(jié)果按升序排列,就像這樣:
SELECTau_lnameFROMauthorsORDERBYau_lname
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),作者名字的顯示將按字母順序排列。ORDERBY子句將作者
名字按升序排列。
你也能夠同時(shí)對(duì)多個(gè)列使用ORDERBY子句。比如,假如你想同時(shí)按升序顯示字段
auIname與字段aufname,你需要對(duì)兩個(gè)字段都進(jìn)行排序:
SELECTau_Iname,aufnameFROMauthorsORDERBYau.name,aufname
這個(gè)查詢首先把結(jié)果按au」nanie字段進(jìn)行排序,然后按字段au_fname排序。記錄將按
如下的順序取出:
au_Inameau_fname
BennetAbraham
RingerAlbert
RingerAnne
SmithMeander
(23row(s)affected)
注意有兩個(gè)作者有相同的名字Ringer。名為AlbertRinger的作者出現(xiàn)名為AnneRinger
的作者之前,這是由于姓Albert按字母順序應(yīng)排在姓Anne之前。
假如你想把查詢結(jié)果按相反的順序排列,你能夠使用關(guān)鍵字DESC。關(guān)鍵字DESC把查詢結(jié)果
按降序排列,如下例所示:
SELECTau_lname,au_fnameFROMauthors
WHEREau_Iname="Ringer"ORDERBYauIname,aufnameDESC
這個(gè)查詢從表authors中取出所有名字為Ringer的作者記錄。ORDERBY子句根據(jù)作者
的名字與姓,將查詢結(jié)果按降序排列。結(jié)果是這樣的:
auInameaufname
RingerAnne
RingerAlbert
(2row(s)affectec)
注意在這個(gè)表中,姓Anne出現(xiàn)在姓Albert之前。作者名字按降序顯示。
你也能夠按數(shù)值型字段對(duì)一個(gè)查詢結(jié)果進(jìn)行排序。比如,假如你怛按降序取出所有書(shū)的價(jià)格,
你能夠使用如下的SQL查詢:
SELECTpriceFROMtitlesORDERBYpriceDESC
這個(gè)SELECT語(yǔ)句從表中取出所有書(shū)的價(jià)格,顯示結(jié)果時(shí),價(jià)格低的書(shū)先顯示,價(jià)格高
的書(shū)后顯示。
警告:
不是特別需要時(shí),不要對(duì)查詢結(jié)果進(jìn)行排序,由于服務(wù)器完成這項(xiàng)工作要費(fèi)些力氣。這
味著帶有ORDERBY子句的SELECT語(yǔ)句執(zhí)行起來(lái)比通常的SELECT語(yǔ)句花的時(shí)間長(zhǎng)。
取出互不相同的記錄
一個(gè)表有可能在同一列中有重復(fù)的值。比如,數(shù)據(jù)庫(kù)pubs的表authors中有兩個(gè)作者
的名字是Ringer。假如你從這個(gè)表中取出所有的名字,名字Ringer將會(huì)顯示兩次。
在特定情況下,你可能只有興趣從一-個(gè)表中取出互不相同的值。假如?個(gè)字段有重復(fù)的
值,你也許希望每個(gè)值只被選取一次,你能夠使用關(guān)鍵字DISTINCT來(lái)做到這一點(diǎn):
SELCETDISTINCTau_lnamcFROMauthorsWHEREau」namc="Ringcr”
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),只返回一個(gè)記錄。通過(guò)在SELECT語(yǔ)句中包含關(guān)鍵字
DISTINCT,你能夠刪除所有重復(fù)的值。比如,假設(shè)有一個(gè)關(guān)于新聞組信息公布的表,你想取
出所有曾在這個(gè)新聞組中公布信息的人的名字,那么你能夠使用關(guān)鍵字DISTINCT。每個(gè)用
戶的名字只取-一次一一盡管有的用戶公布了不止一篇信息。
警告:
如同ORDERBY子句一樣,強(qiáng)制服務(wù)器返回互不相同的值也會(huì)增加運(yùn)行開(kāi)銷(xiāo)。福氣不得
不花費(fèi)一些時(shí)間來(lái)完成這項(xiàng)工作。因此,不是務(wù)必的時(shí)候不要使用關(guān)鍵字DISTINCT。
創(chuàng)建新表
前面說(shuō)過(guò),數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)存儲(chǔ)在表中。數(shù)據(jù)表包含行與列。列決定了表中數(shù)據(jù)的
類(lèi)型。行包含了實(shí)際的數(shù)據(jù)。
比如,數(shù)據(jù)庫(kù)pubs中的表authors有九個(gè)字段。其中的一個(gè)字段名為為au」name,這
個(gè)字段被用來(lái)存儲(chǔ)作者的名字信息。每次向這個(gè)表中添加新作者時(shí),作者名字就被添加到這
個(gè)字段,產(chǎn)生一條新記錄。
通過(guò)定義字段,你能夠創(chuàng)建一個(gè)新表。每個(gè)字段有一個(gè)名字與一個(gè)特定的數(shù)據(jù)類(lèi)型(數(shù)
據(jù)類(lèi)型在后面的“字段類(lèi)型”一節(jié)中講述),比如字段au」name存儲(chǔ)的是字符型數(shù)據(jù)。?個(gè)
字段也能夠存儲(chǔ)其它類(lèi)型的數(shù)據(jù)。
使用SQLSever,創(chuàng)建一個(gè)新表的方法是很多的。你能夠可執(zhí)行一個(gè)SQL語(yǔ)句或者使用
SQL事務(wù)管理器(SQLEnterpriseManager)來(lái)創(chuàng)建一個(gè)新表。在下一節(jié)里,你將學(xué)會(huì)如何
用SQL語(yǔ)句來(lái)創(chuàng)建一個(gè)新表。
用SQL創(chuàng)建新表
注意:
假如你還沒(méi)有建立自己的數(shù)據(jù)庫(kù),現(xiàn)在就跳回到第三章創(chuàng)建這個(gè)庫(kù)。你絕不能向
master,tempdb或者任何其他任何系統(tǒng)數(shù)據(jù)庫(kù)中添加數(shù)據(jù)。
從SQLSever程序組(在任務(wù)欄中)中啟動(dòng)ISQL/w程序。出現(xiàn)查詢窗口后,從窗口頂
部的卜?拉列表中選擇你在第三章所創(chuàng)建的數(shù)據(jù)庫(kù)。下一步,在查詢窗口中犍入下面的SQL
語(yǔ)句,單擊執(zhí)行查詢按鈕,執(zhí)行這個(gè)語(yǔ)句:
CREATETABLEguestbook(visitorVARCHAR(40),conmentsTEXT,entrydate
DATETIME)
假如一切正常,你會(huì)在結(jié)果窗口中看到如下的文字(假如出現(xiàn)特殊,請(qǐng)參閱第三章):
Thiscommand(litnotreturndata,anditdidnotreturnanyrows
祝賀你,你已經(jīng)建立了你的第一個(gè)表!
你所創(chuàng)建的表名為guestbook,你能夠使用這個(gè)表來(lái)存儲(chǔ)來(lái)字你站點(diǎn)訪問(wèn)者的信息。你
是用REEATETABLE語(yǔ)句創(chuàng)建的這個(gè)表,這個(gè)語(yǔ)句有兩部分:第一部份指定表的名子:第二
部份是括在括號(hào)中的各字段的名稱與屬性,相互之間用逗號(hào)隔開(kāi)。
表guestbook有三個(gè)字段:visitor,comments與entrydate。visitor字段存儲(chǔ)訪問(wèn)者
的名字,comments字段存儲(chǔ)訪問(wèn)者對(duì)你站點(diǎn)的意見(jiàn),entrydate字段存儲(chǔ)訪問(wèn)者訪問(wèn)你站點(diǎn)
的日期與時(shí)間。
注意每個(gè)字段名后面都跟有一個(gè)專門(mén)的表達(dá)式。比如,字段名comments后面跟有表達(dá)
式TEXTO這個(gè)表達(dá)式指定了字段的數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型決定了一個(gè)字段能夠存儲(chǔ)什么樣的
數(shù)據(jù)。由于字段comments包含文本信息,其數(shù)據(jù)類(lèi)型定義為文本型。
字段有許多不一致的數(shù)據(jù)類(lèi)型。下一小節(jié)講述SQL所支持的一些重要的數(shù)據(jù)類(lèi)型。
字段類(lèi)型
不一致的字段類(lèi)型用來(lái)存放不一致類(lèi)型的數(shù)據(jù)。創(chuàng)建與使用表時(shí),更你應(yīng)該懂得五種常
用的字段類(lèi)型:字符型,文本型,數(shù)值型,邏輯性與日期型。
字符型數(shù)據(jù)
字符型數(shù)據(jù)非常有用。當(dāng)你需要存儲(chǔ)短的字符串信息時(shí),你總是要用到字符型數(shù)據(jù)。比
如,你能夠把從HTMLform的文本框中搜集到的信息放在字符型字段中。
要建立一個(gè)字段用來(lái)存放可變長(zhǎng)度的字符串信息,你能夠使用表達(dá)式VARCHARo考慮你
前而創(chuàng)建的表guestbook:
CREATETABLEguestbook(visitorV.4RCHAR(40),comnentsTEXT,entrydate
DATETIME)
在這個(gè)例子中,字段visitor的數(shù)據(jù)類(lèi)型為VARCHAR。注意跟在數(shù)據(jù)類(lèi)型后面的括號(hào)中
的數(shù)字。這個(gè)數(shù)字指定了這個(gè)字段所同意存放的字符串的最大長(zhǎng)度。在這個(gè)例了?中,字段
visitor能存放的字符串最長(zhǎng)為四十個(gè)字符。假如名字太長(zhǎng),字符串會(huì)被截?cái)啵槐A羲氖?/p>
個(gè)字符。
VARCHAR類(lèi)型能夠存儲(chǔ)的字符串最長(zhǎng)為255個(gè)字符。要存儲(chǔ)更長(zhǎng)的字符串?dāng)?shù)據(jù),能夠使
用文本型數(shù)據(jù)(下一節(jié)中講述)。
另一種字符型數(shù)據(jù)用來(lái)存儲(chǔ)固定長(zhǎng)度的字符數(shù)據(jù)。下而是一個(gè)使用這種數(shù)據(jù)類(lèi)型的例
子:
CREATETABLEguestbock(visitorCHAR(40),commentsTEXT,entrydate
DATETIME)
在這個(gè)例子中,字段visitor被用來(lái)存儲(chǔ)四十個(gè)字符的固定長(zhǎng)度字符串。表達(dá)式CHAR
指定了這個(gè)字段應(yīng)該是固定長(zhǎng)度的字符串。
VARCHAR型與CHAR型數(shù)據(jù)的這個(gè)差別是細(xì)微的,但是非常重要。假如你向一個(gè)長(zhǎng)度為
四十個(gè)字符的VARCHAR型字段中輸入數(shù)據(jù)BillGates。當(dāng)你以后從這個(gè)字段中取出此數(shù)據(jù)
時(shí),你取出的數(shù)據(jù)其長(zhǎng)度為十個(gè)字符一一字符串BillGates的長(zhǎng)度。
現(xiàn)在假如你把字符串輸入一個(gè)長(zhǎng)度為四十個(gè)字符的CHAR型字段中,那么當(dāng)你取出數(shù)據(jù)
時(shí),所取出的數(shù)據(jù)長(zhǎng)度將是四十個(gè)字符。字符串的后面會(huì)被附加多余的空格。
當(dāng)你建立自己的站點(diǎn)時(shí),你會(huì)發(fā)現(xiàn)使用VARCHAR型字段要比CHAR型字段方便的多。使
用VARCHAR型字段時(shí),你不需要為剪掉你數(shù)據(jù)中多余的空格而操心。
VARCHAR型字段的另?個(gè)突出的好處是它能夠比CHAR型字段占用更少的內(nèi)存與硬盤(pán)空
問(wèn)。當(dāng)你的數(shù)據(jù)庫(kù)很大時(shí),這種內(nèi)存與磁盤(pán)空間的節(jié)約會(huì)變得非常重要。
文本型數(shù)據(jù)
字符型數(shù)據(jù)限制了字符串的長(zhǎng)度不能超過(guò)255個(gè)字符。而使用文本型數(shù)據(jù),你能夠存
放超過(guò)二十億個(gè)字符的字符串。當(dāng)你需要存儲(chǔ)大串的字符時(shí),應(yīng)該使用文本型數(shù)據(jù)。
這里有一-個(gè)使用文本型數(shù)據(jù)的例子:
CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydate
DATETIME)
在這個(gè)例子中,字段comments被用來(lái)存放訪問(wèn)者對(duì)你站點(diǎn)的意見(jiàn)。注意文本型數(shù)據(jù)沒(méi)
有長(zhǎng)度,而上一節(jié)中所講的字符型數(shù)據(jù)是有長(zhǎng)度的。一個(gè)文本型字段中的數(shù)據(jù)通常要么為空,
要么很大。
當(dāng)你從HTMLform的多行文本編輯框(TEXTAREA)中收集數(shù)據(jù)時(shí),你應(yīng)該把收集的信息
存儲(chǔ)于文本型字段中。但是,不管何時(shí),只要你能避免使用文本型字段,你就應(yīng)該不適用它。
文本型字段既大且慢,濫用文本型字段會(huì)使服務(wù)器速度變慢。文本型字段還會(huì)吃掉大量的磁
盤(pán)空間。
警告:
一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),就會(huì)有2K的空間被自動(dòng)分配給
該數(shù)據(jù)。除非刪除該記錄,否則你無(wú)法收回這部分存儲(chǔ)空間。
數(shù)值型數(shù)據(jù)
SQLSever支持許多種不一致的數(shù)值型數(shù)據(jù)。你能夠存儲(chǔ)整數(shù)、小數(shù)、與錢(qián)數(shù)。
通常,當(dāng)你需要在表中的存放數(shù)字時(shí),你要使用整型(INT)數(shù)據(jù)。INT型數(shù)據(jù)的表數(shù)
范圍是從-2,147,483,647到2,147,483,647的整數(shù)。下面是一個(gè)如何使用INT型數(shù)
據(jù)的例子:
CREATETABLEvisitlog(visitorVARCIIAR(40),nunvisitsINT)
這個(gè)表能夠用來(lái)記錄你站點(diǎn)被訪問(wèn)的次數(shù)。只要沒(méi)有人訪問(wèn)你的站點(diǎn)超過(guò)2,147,483,
647次,nubvisits字段就能夠存儲(chǔ)訪問(wèn)次數(shù)。
為了節(jié)約內(nèi)存空間,你能夠使用SMALLINT型數(shù)據(jù)。SMALLINT型數(shù)據(jù)能夠存儲(chǔ)從-32768
到32768的整數(shù)。這種數(shù)據(jù)類(lèi)型的使用方法與INT型完全相同.
最后,假如你實(shí)在需要節(jié)約空間,你能夠使用TINYINT型數(shù)據(jù)。同樣,這種類(lèi)型的使用
方法也與INT型相同,不一致的是這種類(lèi)型的字段只能存儲(chǔ)從3到255的整數(shù)。TINYINT型
字段不能用來(lái)存儲(chǔ)負(fù)數(shù)。
通常,為了節(jié)約空間,應(yīng)該盡可能的使用最小的整型數(shù)據(jù)。一個(gè)TINYINT型數(shù)據(jù)只占用
一個(gè)字節(jié);一個(gè)INT型數(shù)據(jù)占用四個(gè)字節(jié)。這看起來(lái)大概差別不大,但是在比較大的表中,
字節(jié)數(shù)的增長(zhǎng)是很快的。另一方面,一旦你已經(jīng)創(chuàng)建了一個(gè)字段,要修改它是很困難的。因
此,為安全起見(jiàn),你應(yīng)該預(yù)測(cè)下列,一個(gè)字段所需要存儲(chǔ)的數(shù)值最大有可能是多大,然后選
擇適當(dāng)?shù)臄?shù)據(jù)類(lèi)型。
為了能時(shí)字段所存放的數(shù)據(jù)有更多的操縱,你能夠使用NUVERIC型數(shù)據(jù)來(lái)同時(shí)表示?個(gè)
數(shù)的整數(shù)部分與小數(shù)部分。NUMERIC型數(shù)據(jù)使你能表示非常大的數(shù)一一比1NT型數(shù)據(jù)要大得
多。一個(gè)NUMERIC型字段能夠存儲(chǔ)從-10:退到10必范圍內(nèi)的數(shù)。NUMERIC型數(shù)據(jù)還使你能表示
有小數(shù)部分的數(shù)。比如,你能夠在NUMERIC型字段中存儲(chǔ)小數(shù)3.14。
當(dāng)定義一個(gè)NUMERIC型字段時(shí),你需要同時(shí)指定整數(shù)部分的大小與小數(shù)部分的大小。這
里有一個(gè)使用這種數(shù)據(jù)類(lèi)型的例子:
CREATETABLEnumeric_data(bignumberNUMERIC(28,0).
fractionNUMERIC(5,4))
當(dāng)這個(gè)語(yǔ)句執(zhí)行時(shí),將創(chuàng)建一個(gè)名為numeric_data的包含兩個(gè)字段的表。字段
bignumber能夠存儲(chǔ)直到28位的整數(shù)。字段fraction能夠存儲(chǔ)有五位整數(shù)部分與四位小數(shù)
部分的小數(shù)。
一個(gè)NUMERIC型數(shù)據(jù)的整數(shù)部分最大只能有28位,小數(shù)部分的位數(shù)務(wù)必小于或者等于
整數(shù)部分的位數(shù),小數(shù)部分能夠是零。
你能夠使用INT型或者NUMERIC型數(shù)據(jù)來(lái)存儲(chǔ)錢(qián)數(shù)。但是,專門(mén)有另外兩種數(shù)據(jù)類(lèi)型用
于此目的。假如你希望你的網(wǎng)點(diǎn)能掙很多錢(qián),你能夠使用MONEY型數(shù)據(jù)。假如你的野心不大,
你能夠使用SMALLMONEY型數(shù)據(jù)。MONEY型數(shù)據(jù)能夠存儲(chǔ)從-922,337,203,685,477.5808
到922,337,203,685,477.5807的錢(qián)數(shù)。假如你需要存儲(chǔ)比這還大的金額,你能夠使用
NUMERIC型數(shù)據(jù)。
SMALLMONEY型數(shù)據(jù)只能存儲(chǔ)從-214,748.3648到214,748.3647的錢(qián)數(shù)。同樣,假如
能夠的話,你應(yīng)該用SMALINONEY型來(lái)代替MONEY型數(shù)據(jù),以節(jié)約空間。下面的例子顯示了
如何使用這兩種表示錢(qián)的數(shù)據(jù)類(lèi)型:
CREATETABLEproducts(productVARC1LAR(40),priceMONEY,
Discount_priceSM?\I.I.MONE¥)
這個(gè)表能夠用來(lái)存儲(chǔ)商品的折扣與普通售價(jià)。字段price的數(shù)據(jù)類(lèi)型是MONEY,字段
discountprice的數(shù)據(jù)類(lèi)型是SM.1\LLM0NEYo
存儲(chǔ)邏輯值
假如你使用復(fù)選框(CHECKBOX)從網(wǎng)頁(yè)中搜集信息,你能夠把此信息存儲(chǔ)在BIT型字段
中。BIT型字段只能取兩個(gè)值:0或者1。這里有一個(gè)如何使用這種字段的例子:
CREATETABLEopinion(visitorVARCHAR(40),goodBIT)
這個(gè)表能夠用來(lái)存放對(duì)你的網(wǎng)點(diǎn)進(jìn)行民意調(diào)查所得的信息?訪問(wèn)者能夠投票表示他們是
否喜歡你的網(wǎng)點(diǎn)。假如他們投YES,就在BIT型字段中存入1。反之,假如他們投NO,就在
字段中存入0(在下一章里,你將學(xué)會(huì)如何計(jì)算投票)。
當(dāng)心,在你創(chuàng)建好一個(gè)表之后,你不能向表中添加BIT型字段。假如你打算在一個(gè)表中
包含BIT型字段,你務(wù)必在創(chuàng)建表時(shí)完成。
存儲(chǔ)日期與時(shí)間
當(dāng)你建立一個(gè)網(wǎng)點(diǎn)時(shí),你也許需要記錄在一段時(shí)間內(nèi)的訪問(wèn)者數(shù)量。為了能夠存儲(chǔ)日期
與時(shí)間,你需要使用DATETIME型數(shù)據(jù),如下例所示:
CREATETABLvisitorlcg(visitorVARCHAR(40),arnvaltimeDATETIME,
departuretimeDATETIME:
這個(gè)表能夠用來(lái)記錄訪問(wèn)者進(jìn)入與離開(kāi)你網(wǎng)點(diǎn)的時(shí)間與日期。一個(gè)DATETIME型的字段
能夠存儲(chǔ)的日期范圍是從1753年1月1日第一亳秒到9999年12月31日最后一亳秒。
假如你不需要覆蓋這么大范圍的日期與時(shí)間,你能夠使用SMALLDATETTME型數(shù)據(jù)。它與
DATETIME型數(shù)據(jù)同樣使用,只只是它能表示的日期與時(shí)間范圍比DATETIME型數(shù)據(jù)小,而且
不如DATETIME型數(shù)據(jù)精確。一個(gè)SMALLDATETIME型的字段能夠存儲(chǔ)從1900年1月1日到
2079年6月6日的日期,它只能精確到秒。
DATETIME型字段在你輸入日期與時(shí)間之前并不包含實(shí)際的數(shù)據(jù),認(rèn)識(shí)這一點(diǎn)是重要的。
在下一章,你將學(xué)習(xí)如何使用大量的SQL函數(shù)來(lái)讀取與操作日期與時(shí)間(參見(jiàn)卜面的“缺省
值”一節(jié))。你也能夠在VBScript與JScript中使用日期與時(shí)間函數(shù)來(lái)向一個(gè)DATETIME型
字段中輸入日期與時(shí)間。
字段屬性
上一節(jié)介紹了如何建立包含不一致類(lèi)型字段的表。在這一節(jié)中,你將學(xué)會(huì)如何使用字段
的三個(gè)屬性。這些屬性同意你操縱空值,缺省值與標(biāo)識(shí)值。
同意與禁止空值
大多數(shù)字段能夠同意空值(NULL)。當(dāng)一個(gè)字段同意了空值后,假如你不改變它,它將
一直保持空值。空值(NULL)與零是不一致的,嚴(yán)格的說(shuō),空值表示沒(méi)有任何值。
為了同意一個(gè)字段同意空值,你要在字段定義的后面使用表達(dá)式NULL。比如,下面的表中
兩個(gè)字段都同意同意空值:
CREATETABLEempty(empty1CHAR(40)NULL,empty2INTNULL(
注意:
BIT型數(shù)據(jù)不能是空值。一個(gè)這種類(lèi)型的字段務(wù)必取0或者者1。
有的時(shí)候你需要禁止一個(gè)字段使用空值。比如,假設(shè)有一個(gè)表存儲(chǔ)著信用卡號(hào)碼與信用
卡有效日期,你不可能希望有人輸入一個(gè)信用卡號(hào)碼但不輸入有效日期。為了強(qiáng)制兩個(gè)字段
都輸入數(shù)據(jù),你能夠用下面的方法建立這個(gè)表:
CREATETABLEcreditcards(creditcardnumberCH.AR(20)NOTNULL,
Creditcard_expireDATBTIMENOTNULL)
注意字段定義的后面跟有表達(dá)式NOTNULLo通過(guò)包含表達(dá)式NOTNULL,你能夠禁止任
何人只在一個(gè)字段中插入數(shù)據(jù),而不輸入另一個(gè)字段的數(shù)據(jù)。
你將會(huì)發(fā)現(xiàn),在你建設(shè)自己的網(wǎng)點(diǎn)過(guò)程中,這種禁止空值的能力是非常有用的。假如你
指定一個(gè)字段不能同意空值,那么當(dāng)你試圖輸入一個(gè)空值時(shí),會(huì)有錯(cuò)誤警告。這些錯(cuò)誤警告
能夠?yàn)槌绦蛘{(diào)試提供有價(jià)值的線索。
缺省值
假設(shè)有一個(gè)存儲(chǔ)地址信息的表,這個(gè)表的字段包含街道、城市、州、郵政編碼與國(guó)家。
假如你估計(jì)地址的大部分是在美國(guó),你能夠把這個(gè)值作為country字段的缺省值。
為了在創(chuàng)建一個(gè)表時(shí)指定缺省值,你能夠使用表達(dá)式DEFAJLT。請(qǐng)看卜.而這個(gè)在創(chuàng)建表
時(shí)使用缺省值的例子:
CREATETABLEaddresses(streetVARCHAR(60)NULL,
cityVARCHAR(40)NULL,
stateVARCI1AR(2O)NULL
zipVARCHAR(20)NULL,
countryVARCHAR(30)DEFAULT'USA')
在這個(gè)例子中,字段country的缺省值被指定為美國(guó)。注意單引號(hào)的使用,引號(hào)指明這
是字符型數(shù)據(jù)。為了給非字符型的字段指定缺省值,不要把該值擴(kuò)在引號(hào)中:
CREATETABLEorders(priceMONEYDEFAULT$38.00,
quantityINTDEFAULT50,
entrydateDATETIMEDEFAULTGETDATEO)
在這個(gè)CREATETABLE語(yǔ)句中,每個(gè)字段都指定/一個(gè)缺省佰。注意DATETIME型字段
entrydate所指定的缺省值,該缺省值是函數(shù)GcldaleO的返回值,該函數(shù)返回當(dāng)前的日期與
時(shí)間。
標(biāo)識(shí)字段
每個(gè)表能夠有?個(gè)也只能有?個(gè)標(biāo)識(shí)字段。—個(gè)標(biāo)識(shí)字段是唯?標(biāo)識(shí)表中每條記錄的特
殊字段。比如,數(shù)據(jù)庫(kù)pubs中的表jobs包含了一個(gè)唯一標(biāo)識(shí)每個(gè)工作標(biāo)識(shí)字段:
job_idjob_desc
1NewHireJobnotspecified
2ChiefExecutiveofficer
3BushnessOperationsManager
4ChiefFinancialOfficier
5Publisher
字段job_id為每個(gè)工作提供了唯一的一個(gè)數(shù)字。假如你決定增加一個(gè)新工作,新增記
錄的job_id字段會(huì)被自動(dòng)賦給一個(gè)新的唯一值。
為了建立一個(gè)標(biāo)識(shí)字段,你只需在字段定義后面加上表達(dá)式IDENTITY即可。你只能把
NUMERIC型或者INT型字段設(shè)為標(biāo)識(shí)字段,這里有一個(gè)例子:
CREATETABLEvisitcrID(thelDNLBERIC(18)IDENTITY,nameVARCHAR(4O))
這個(gè)語(yǔ)句所創(chuàng)建的表包含一個(gè)名為theid的標(biāo)識(shí)字段。每當(dāng)一個(gè)新的訪問(wèn)者名字添加到
這個(gè)表中時(shí),這個(gè)字段就被自動(dòng)賦給一個(gè)新值。你能夠用這個(gè)表為你的站點(diǎn)的每一個(gè)用戶提
供唯?標(biāo)識(shí)。
技巧:
建立一個(gè)標(biāo)示字段時(shí),注意使用足夠大的數(shù)據(jù)類(lèi)型。比如你使用TINYIXT型數(shù)據(jù),那么
你只能向表中添加255個(gè)記錄。假如你估計(jì)一個(gè)表可能會(huì)變得很大,你應(yīng)該使用NUMERIC
型數(shù)據(jù)。
標(biāo)識(shí)字段的存在會(huì)使你想嘗試許多不可能的情況。比如,你也許想利用標(biāo)識(shí)字段來(lái)對(duì)記
錄進(jìn)行基于它們?cè)诒碇形恢玫倪\(yùn)算。你應(yīng)該拋棄這種意圖。每個(gè)記錄的標(biāo)識(shí)字段的值是互不
相同的,但是,這并不禁止一個(gè)標(biāo)識(shí)字段的標(biāo)識(shí)數(shù)字之間存在間隔。比如,你永遠(yuǎn)不要試圖
利用一個(gè)表的標(biāo)識(shí)字段來(lái)取出表中的前十個(gè)記錄。這種操作會(huì)導(dǎo)致失敗,比如說(shuō)6號(hào)記錄與
7號(hào)記錄根本不存在。
使用SQL事務(wù)管理器創(chuàng)建新表
你能夠使用前面幾節(jié)所講的方法創(chuàng)建新表。但是,使用事務(wù)管理器創(chuàng)建新表會(huì)更容易。
這一節(jié)介紹如何使用這個(gè)程序創(chuàng)更新表。
從任務(wù)欄的SQLSever程序組中選擇SQLEnterpriseManager,啟動(dòng)該程序,你會(huì)看
到如圖10.4所示的窗口。瀏覽服務(wù)管理器窗口中的樹(shù)形結(jié)構(gòu),選擇名為Database的文件夾。
打開(kāi)文件夾Database后,選擇你在第三章中所建立的數(shù)據(jù)庫(kù)。
注意:
假如你還沒(méi)有創(chuàng)建自己的數(shù)據(jù)庫(kù),回到第三章創(chuàng)建它。你決不要向master,lempdb或者
任何其它系統(tǒng)數(shù)據(jù)庫(kù)中添加數(shù)據(jù)。
在選擇了數(shù)據(jù)庫(kù)之后,你會(huì)看到一個(gè)名為Group/users的文件夾與一個(gè)名為objects
的文件夾。打開(kāi)文件夾。bjects,你會(huì)看到許多文件夾,其中一個(gè)名為T(mén)ables。用右鍵單擊
文件夾Tables并選擇Newtable,就會(huì)出現(xiàn)如圖10.5所示的窗口。
你能夠使用ManagerTables窗口來(lái)創(chuàng)建一,個(gè)新表。ManagerTables窗口有7個(gè)列:
Key,Column,Name,Datatype,Size,Nulls與Default,ManagerTables窗口中的每一行標(biāo)明
表中一個(gè)字段的信息。
圖10.4
10.5
要建立一個(gè)新表,你至少要輸入一行信息。在名為ColumnName的列下而鍵入
mycolumn。下一步,選擇Datatype列,并從下拉列表中選擇CHAR。當(dāng)你在這兩個(gè)列中輸入
信息后,窗口將是如圖10.6所示的樣子。
圖10.6
你己經(jīng)建立了一個(gè)只有一個(gè)字段的簡(jiǎn)單的表。單擊儲(chǔ)存按扭儲(chǔ)存這個(gè)新表。當(dāng)要求你榆
入新表的名字時(shí),輸入mytable并單擊0K。現(xiàn)在這個(gè)表已經(jīng)儲(chǔ)存到了你的數(shù)據(jù)庫(kù)中。
假如你打開(kāi)服務(wù)管理器窗口中的文件夾Tables,你會(huì)看到你所建立的新表被列出。你能夠
雙擊該表的圖表來(lái)編輯它,這時(shí)ManagerTables窗口會(huì)重新出現(xiàn),你能夠增加新的字段并
重新儲(chǔ)存。
用SQL事務(wù)管理器能夠做的工作,你都能夠用SQL語(yǔ)句來(lái)實(shí)現(xiàn)。但是,事務(wù)管理器使得
建表過(guò)程變得更加簡(jiǎn)單。
向表中添加數(shù)據(jù)
下一章將討論如何使用SQL向一個(gè)表中插入數(shù)據(jù)。但是,假如你需要向一個(gè)表中添加許
多條記錄,使用SQL語(yǔ)句輸入數(shù)據(jù)是很不方便的。幸運(yùn)的是,MicrosoftSQLSever帶有
一個(gè)稱之MicrosoftQuery的客戶端應(yīng)用程序,這個(gè)程序使得句表中添加數(shù)據(jù)變得容易了。
啟動(dòng)位于任務(wù)欄SQLSever程序組中的MicrosoftQuery程序。從窗口頂部的菜單中選
擇File|NewQuery,這時(shí)會(huì)顯示一個(gè)SelectDataSource對(duì)話框(見(jiàn)圖10.7)o選擇你的
數(shù)據(jù)源名字并單擊Use。
圖10。7
輸入你的登錄帳號(hào)與密碼后,程序要求你選擇一個(gè)表與一個(gè)數(shù)據(jù)庫(kù)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 社會(huì)公正與福利制度試題及答案
- 2025年深海礦產(chǎn)資源勘探技術(shù)政策法規(guī)解讀報(bào)告
- 軟件設(shè)計(jì)師考試相關(guān)法律知識(shí)試題及答案
- 2025年腫瘤精準(zhǔn)醫(yī)療跨學(xué)科合作機(jī)制與模式創(chuàng)新報(bào)告
- 2024年廣西壯族自治區(qū)機(jī)關(guān)事務(wù)管理局下屬事業(yè)單位真題
- 無(wú)人機(jī)物流配送在物流行業(yè)技術(shù)創(chuàng)新中的應(yīng)用報(bào)告
- 提高網(wǎng)絡(luò)管理效益的策略與試題及答案
- 涼山州會(huì)理市全國(guó)考調(diào)事業(yè)單位人員考試真題2024
- 佛山順德農(nóng)商銀行科技創(chuàng)新支行招聘考試真題2024
- 西方各國(guó)疫情防控政策的政治反響試題及答案
- 有害物質(zhì)過(guò)程管理系統(tǒng)HSPM培訓(xùn)教材
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) X2-10-07-17 陶瓷產(chǎn)品設(shè)計(jì)師(試行)勞社廳發(fā)200633號(hào)
- 深圳醫(yī)院質(zhì)子重離子治療中心項(xiàng)目可行性研究報(bào)告
- 我國(guó)的生產(chǎn)資料所有制
- 2024年上海市黃浦區(qū)四年級(jí)數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題含解析
- 初中數(shù)學(xué)《相似三角形》壓軸30題含解析
- 2024年海南省中考數(shù)學(xué)試題卷(含答案解析)
- 云南省食品安全管理制度
- 河南省鶴壁市2023-2024學(xué)年七年級(jí)下學(xué)期期末數(shù)學(xué)試題
- MOOC 電路分析AⅠ-西南交通大學(xué) 中國(guó)大學(xué)慕課答案
- 托育運(yùn)營(yíng)方案
評(píng)論
0/150
提交評(píng)論