版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQL數(shù)據(jù)操作基礎(chǔ)(初級(jí))1
netnova于99-6-2713:57:02加貼在數(shù)據(jù)庫(kù)探討:
為了建立交互站點(diǎn),你需要使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)來(lái)自訪問(wèn)者的信息。例
如,你要建立一個(gè)職業(yè)介紹效勞的站點(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)化查詢(xún)語(yǔ)言〃(SQL)來(lái)操作數(shù)據(jù)
庫(kù)。SQL語(yǔ)言是數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。在ActiveSeverPages中,無(wú)論何
時(shí)你要訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),你就要使用SQL語(yǔ)言。因此,掌握好SQL對(duì)ASP
編程是非常重要的。
注意:
你可以把“SQL〃讀作“sequel”,也可以按單個(gè)字母的讀音讀作S—Q—
Lo兩種發(fā)音都是正確的,每種發(fā)音各有大量的支持者。在本書(shū)里,認(rèn)
u
為“SQL”讀作sequel'o
通過(guò)這一章的學(xué)習(xí),你將理解怎樣用SQL實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢(xún),你將學(xué)會(huì)怎
樣使用這種查詢(xún)從數(shù)據(jù)表中取出信息,最后,你將學(xué)會(huì)怎樣設(shè)計(jì)和建立
自己的數(shù)據(jù)庫(kù)。
注意:
通過(guò)下面幾章對(duì)SQL的介紹,你將對(duì)SQL有足夠的了解,從而可以有效
地使用ActiveSeverPageso但是,SQL是一種復(fù)雜的語(yǔ)言,本書(shū)不可
能包括它的全部細(xì)節(jié)。要全面掌握SQL語(yǔ)言,你需要學(xué)習(xí)在Microsoft
SQLSever中使用SQL。你可以到附近的書(shū)店去買(mǎi)一本MicrosoftSQL
Sever6.5O
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è)專(zhuān)門(mén)的ANSI標(biāo)準(zhǔn))
注意:
不要在你的站點(diǎn)上試圖用MicrosoftAccess代替MicrosoftSQL
SevereSQLSever可以同時(shí)效勞于許多用戶(hù),如果你希望你的站點(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è)簡(jiǎn)單的表包括name和e-mailaddress:
NameEmailAddress
BillGates
presidentClinton
StephenWalther
這個(gè)表有兩列(列也稱(chēng)為字段,域):Name和EmailAddresso有三
行,每一行包含一組數(shù)據(jù)。一行中的數(shù)據(jù)組合在一起稱(chēng)為一條記錄。
無(wú)論何時(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)取出記錄,因?yàn)檫@樣做會(huì)降低SQLSever取記錄的效率。使
用SQL,你只能按查詢(xún)條件來(lái)讀取記錄。
當(dāng)考慮如何從表中取出記錄時(shí),自然會(huì)想到按記錄的位置讀取它們。例
如,也許你會(huì)嘗試通過(guò)一個(gè)循環(huán),逐個(gè)記錄地掃描,來(lái)選出特定的記
錄。在使用SQL時(shí),你必須訓(xùn)練自己,不要有這種思路。
假設(shè)你想選出所有的名字是“BillGates”的記錄,如果使用傳統(tǒng)的編
程語(yǔ)言,你也許會(huì)構(gòu)造一個(gè)循環(huán),逐個(gè)查看表中的記錄,看名字域是否
是“BillGates"。
這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說(shuō),
“選擇所有名字域等于BillGates的記錄〃,SQL就會(huì)為你選出所有符
合條件的記錄。SQL會(huì)確定實(shí)現(xiàn)查詢(xún)的最正確方法。
建設(shè)你想取出表中的前十個(gè)記錄。使用傳統(tǒng)的編程語(yǔ)言,你可以做一個(gè)
循環(huán),取出前十個(gè)記錄后結(jié)束循環(huán)。但使用標(biāo)準(zhǔn)的SQL查詢(xún),這是不可
能實(shí)現(xiàn)的。從SQL的角度來(lái)說(shuō),在一個(gè)表中不存在前十個(gè)記錄這種概
念。
開(kāi)始時(shí),當(dāng)你知道你不能用SQL實(shí)現(xiàn)某些你感覺(jué)應(yīng)該能實(shí)現(xiàn)的功能,你
會(huì)受到挫折。你也許會(huì)以頭撞墻甚至想寫(xiě)惡毒的信件給SQL的設(shè)計(jì)者
們。但后來(lái)你會(huì)認(rèn)識(shí)到,SQL的這個(gè)特點(diǎn)不僅不是個(gè)限制,反而是其長(zhǎng)
處。因?yàn)镾QL不根據(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ù)查詢(xún)。如果你熟悉Internet引擎,那
么你已經(jīng)熟悉查詢(xún)了。你使用查詢(xún)來(lái)取得滿(mǎn)足特定條件的信息。例如,
如果你想找到有ASP信息的全部站點(diǎn),你可以連接到Y(jié)ahoo!并執(zhí)行一個(gè)
對(duì)ActiveSeverPages的搜索。在你輸入這個(gè)查詢(xún)后,你會(huì)收到一個(gè)列
表,表中包括所有其描述中包含搜索表達(dá)式的站點(diǎn)。
多數(shù)Internet引擎允許邏輯查詢(xún)。在邏輯查詢(xún)中,你可以包括特殊的運(yùn)
算符如AND、OR和NOT,你使用這些運(yùn)算符來(lái)選擇特定的記錄。例如,你
可以用AND來(lái)限制查詢(xún)結(jié)果。如果你執(zhí)行一個(gè)對(duì)ActiveSeverPages
前面說(shuō)過(guò),查詢(xún)可以在查詢(xún)條件中包含邏輯運(yùn)算符。假設(shè)你想讀取Bill
Gates或Clinton總統(tǒng)的所有email地址,你可以使用下面的查詢(xún)語(yǔ)
句:
SELECTemailFROMemail_tableWHEREname="Bi11Gates,rOR
name="presidentClinton0
此例中的查詢(xún)條件比前一個(gè)復(fù)雜了一點(diǎn)。這個(gè)語(yǔ)句從表email_table中
選出所有name列為BillGates或presidentClinton的記錄。如果表
中含有BillGates或presidentClinton的多個(gè)地址,所有的地址都被
讀取。
SELECT語(yǔ)句的結(jié)構(gòu)看起來(lái)很直觀。如果你請(qǐng)一個(gè)朋友從一個(gè)表中為你選
擇一組記錄,你也許以非常相似的方式提出你的要求。在SQLSELECT語(yǔ)
句中,你"SELECT特定的列FROM一個(gè)表WHERE某些列滿(mǎn)足一個(gè)特定的條
件〃。
下一節(jié)將介紹怎樣執(zhí)行SQL查詢(xún)來(lái)選取記錄。這將幫助你熟悉用SELECT
語(yǔ)句從表中取數(shù)據(jù)的各種不同方法。
SQL數(shù)據(jù)操作基礎(chǔ)(初級(jí))2
netnova于99-6-2713:57:38加貼在數(shù)據(jù)庫(kù)探討:
使用ISQL執(zhí)行SELECT查詢(xún)
當(dāng)你安裝SQLSeve「時(shí),你同時(shí)安裝了一個(gè)叫作ISQL/w的應(yīng)用程序。
ISQL/w允許你執(zhí)行交互的SQL查詢(xún)。在把查詢(xún)包括到你的ASP網(wǎng)頁(yè)中之
前,用ISQL/w對(duì)其進(jìn)行測(cè)試是非常有用的。
注意:
在這本書(shū)的第一部份,你學(xué)習(xí)了怎樣安裝和配置MicrosoftSQL
Sever。如果沒(méi)有安裝SQLSever或者SQLSever不能運(yùn)行,請(qǐng)參閱第
三章“安裝和使用SQLSever'o
選擇任務(wù)上SQLSever程序組中的ISQL_w以啟動(dòng)該程序。程序啟動(dòng)時(shí),
首先會(huì)出現(xiàn)一個(gè)對(duì)話框,要求輸入效勞器信息和登錄信息(見(jiàn)圖
10.1)o在Sever框中,輸入你的SQL效勞器的名字。如果效勞器正運(yùn)
行在本地計(jì)算機(jī)上,效勞器名字就是你計(jì)算機(jī)的名字。在登錄信息框
中,輸入一個(gè)登錄帳號(hào)和密碼或選擇使用“可信連接〃,然后單擊
Connect按鈕。
圖10o1
注意:
如果你將SQLSever配置為使用完整平安或混合平安,那么你可以使用
可信連接。如果你使用標(biāo)準(zhǔn)平安,你則需要提供用戶(hù)帳號(hào)和密碼。要了
解更多信息,參見(jiàn)第三章。
如果一切正常,在你單擊連接按鈕后會(huì)出現(xiàn)一個(gè)查詢(xún)窗口,如圖10.2所
示。(如果有異常,請(qǐng)參考第三章)
圖10.2
在執(zhí)行查詢(xún)之前,你需要選擇數(shù)據(jù)庫(kù)。安裝SQLSever時(shí)你已為自己創(chuàng)
立了一個(gè)數(shù)據(jù)庫(kù),SQLSever還有許多系統(tǒng)數(shù)據(jù)庫(kù),如master,model,
msdb,和tempdbo
方便的是,SQLSever帶有一個(gè)特殊的名為pubs的例子數(shù)據(jù)庫(kù)。庫(kù)pubs
中包含供一個(gè)虛擬的出版商使用的各個(gè)表。文檔中所有的例子程序都是
針對(duì)這個(gè)庫(kù)來(lái)設(shè)計(jì)的。本書(shū)中的許多例子也使用這個(gè)數(shù)據(jù)庫(kù)。
在查詢(xún)窗口頂部的DB下拉框中選擇數(shù)據(jù)庫(kù)pubs,這樣你就選擇了數(shù)據(jù)
庫(kù)。你所有的查詢(xún)都將針對(duì)這個(gè)庫(kù)中的各個(gè)表來(lái)執(zhí)行。現(xiàn)在你可以執(zhí)行
你的第一個(gè)查詢(xún)了。這真讓人興奮!
你的第一個(gè)查詢(xún)將針對(duì)一個(gè)名為autrors的表,表中包含所有為某個(gè)虛
擬出版商工作的作者的相關(guān)數(shù)據(jù)。單擊查詢(xún)窗口并輸入以下的語(yǔ)句:
SELECTphoneFROMauthorsWHEREau_name=,fRingerH
輸入完成后,單擊執(zhí)行查詢(xún)按鈕(一個(gè)綠色三角形,看起來(lái)像YCR播放
鍵)。單擊此按鈕后,任何出現(xiàn)在查詢(xún)窗口中的語(yǔ)句均會(huì)被執(zhí)行。查詢(xún)
窗口會(huì)自動(dòng)變成結(jié)果顯示窗口,你可以看到查詢(xún)的結(jié)果(見(jiàn)圖10.3)。
你看到的查詢(xún)結(jié)果也許與圖10.3所示的不同。在SQLSever的不同版本
中,庫(kù)pubs中的數(shù)據(jù)會(huì)有所不同。對(duì)SQLSever6.5來(lái)說(shuō),將會(huì)找到兩
條記錄。結(jié)果顯不窗口中應(yīng)顯不如下內(nèi)容:
phone
801826_0752
8018260752
(2row(s)affected)
圖10.3
你所執(zhí)行的SELECT語(yǔ)句從表authors中取出所有名字為Ringer的作者
的電話號(hào)碼。你通過(guò)在WHERE子句中使用特殊的選擇條件來(lái)限制查詢(xún)的
結(jié)果。你也可以忽略選澤條件,從表中取出所有作者的電話號(hào)碼。要做
到這一點(diǎn),單擊Queu標(biāo)簽,返回到查詢(xún)窗口,輸入以下的SELECT語(yǔ)
句:
SELECTPhoneFROMauthors
這個(gè)查詢(xún)執(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,auIname,phoneFROMauthors
這個(gè)SELECT語(yǔ)句執(zhí)行后,將取出這三個(gè)列的所有值。下面是這個(gè)查詢(xún)的
結(jié)果的一個(gè)例如(為了節(jié)省紙張,只顯示查詢(xún)結(jié)果的一局部,其余記錄
用省略號(hào)代替):
aufnameauInamephone
JohnsonWhite408496_7223
MarjorieGreen4159867020
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查詢(xún)中頻繁使用星號(hào)。
技巧:
你可以使用星號(hào)來(lái)查看一個(gè)表的所有列的名字。要做到這一點(diǎn),只需要
在執(zhí)行完SELECT語(yǔ)句后看一下查詢(xún)結(jié)果的列標(biāo)題。
操作多個(gè)表
到現(xiàn)在為止,你只嘗試了用一句SQL查詢(xún)從一個(gè)表中取出數(shù)據(jù)。你也可
以用一個(gè)SELECT語(yǔ)句同時(shí)從多個(gè)表中取出數(shù)據(jù),只需在SELECT語(yǔ)句的
FROM從句中列出要從中取出數(shù)據(jù)的表名稱(chēng)即可:
SELECTau_lname,titleFROMauthors,titles
這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),同時(shí)從表authors和表titles中取出數(shù)據(jù)。
從表authors中取出所有的作者名字,從表titles中取出所有的書(shū)名。
在ISQL/w程序中執(zhí)行這個(gè)查詢(xún),看一下查詢(xún)結(jié)果。你會(huì)發(fā)現(xiàn)一些奇怪的
出乎意料的情況:作者的名字并沒(méi)有和它們所著的書(shū)相匹配,而是出現(xiàn)
了作者名字和書(shū)名的所有可能的組合,這也許不是你所希望見(jiàn)到的。
出了什么過(guò)錯(cuò)?問(wèn)題在于你沒(méi)有指明這兩個(gè)表之間的關(guān)系。你沒(méi)有通過(guò)
任何方式告訴SQL如何把表和表關(guān)聯(lián)在一起。由于不知道如何關(guān)聯(lián)兩個(gè)
表,效勞器只能簡(jiǎn)單地返回取自?xún)蓚€(gè)表中的記錄的所有可能組合。
要從兩個(gè)表中選出有意義的記錄組合,你需要通過(guò)建立兩表中字段的關(guān)
系來(lái)關(guān)聯(lián)兩個(gè)表。要做到這一點(diǎn)的途徑之一是創(chuàng)立第三個(gè)表,專(zhuān)門(mén)用來(lái)
描述另外兩個(gè)表的字段之間的關(guān)系。
表authors有一個(gè)名為au_id的字段,包含有每個(gè)作者的唯一標(biāo)識(shí)。表
titles有一個(gè)名為的字段,包含每個(gè)書(shū)名的唯一標(biāo)識(shí)。如果你
能在字段au_id和字段之間建立一個(gè)關(guān)系,你就可以關(guān)聯(lián)這兩
個(gè)表。數(shù)據(jù)庫(kù)pubs中有一個(gè)名為titleauthor的表,正是用來(lái)完成這個(gè)
工作。表中的每個(gè)記錄包括兩個(gè)字段,用來(lái)把表titles和表authors關(guān)
聯(lián)在一起。下面的SELECT語(yǔ)句使用了這三個(gè)表以得到正確的結(jié)果:
SELECTau_name,titleFROMauthors,titles,titleauthor
WHEREauthors.au_id=ti11eauthor.au_id
ANDtitles.titleid=titleauthor.titleid
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),每個(gè)作者都將與正確的書(shū)名相匹配。表
titleauthor指明了表authors和表titles的關(guān)系,它通過(guò)包含分別來(lái)
自?xún)蓚€(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.au_id的字段屬于表titleauthor,兩者不會(huì)混淆。
通過(guò)使用第三個(gè)表,你可以在兩個(gè)表的字段之間建立各種類(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)系。因?yà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)。
據(jù)操作基礎(chǔ)(初級(jí))3
netnova于99-6-2713:58:21加貼在數(shù)據(jù)庫(kù)探討:
操作字段
通常,當(dāng)你從一個(gè)表中取出字段值時(shí),該值與創(chuàng)立該表時(shí)所定義的字段
名聯(lián)系在一起。如果你從表authors中選擇所有的作者名字,所有的值
將會(huì)與字段名au」name相聯(lián)系。但是在某些情況下,你需要對(duì)字段名進(jìn)
行操作。在SELECT語(yǔ)句中,你可以在缺省字段名后面僅跟一個(gè)新名字來(lái)
取代它。例如,可以用一個(gè)更直觀易讀的名字AuthorLastName來(lái)代替
字段名au_lname:
SELECTauInameHAuthorLastName,fFROMauthors
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),來(lái)自字段au_lname的值會(huì)與uAuthorLast
Name"相聯(lián)系。查詢(xún)結(jié)果可能是這樣:
AuthorLastName
White
Green
Carson
0'Leary
Straight
(23row(s)affected)
注意字段標(biāo)題不再是au_lname,而是被AuthorLastName所取代。
你也可以通過(guò)執(zhí)行運(yùn)算,來(lái)操作從一個(gè)表返回的字段值。例如,如果你
想把表titles中的所有書(shū)的價(jià)格加倍,你可以使用下面的SELECT語(yǔ)
句:
SELECTprice*2FROMtitles
當(dāng)這個(gè)查詢(xún)執(zhí)行時(shí),每本書(shū)的價(jià)格從表中取出時(shí)都會(huì)加倍。但是,通過(guò)
這和途徑操作字段不會(huì)改變存儲(chǔ)在表中的書(shū)價(jià)。對(duì)字段的運(yùn)算只會(huì)影響
SELECT語(yǔ)句的輸出,而不會(huì)影響表中的數(shù)據(jù)。為了同時(shí)顯示書(shū)的原始價(jià)
格和漲價(jià)后的新價(jià)格,你可以使用下面的查詢(xún):
SELECTpriceuOriginalprice”,price*2"Newprice"FROMtitles
當(dāng)數(shù)據(jù)從表titles中取出時(shí),原始價(jià)格顯示在標(biāo)題Originalprice下
面,加倍后的價(jià)格顯示在標(biāo)題Newprice下面。結(jié)果可能是這樣:
originalpricenewprice
39.98
11.9523.90
5.98
39.98
???
(18row(s)affected)
你可以使用大多數(shù)標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算符來(lái)操作字段值,如加(+),減(-
),乘(*)和除(/)。你也可以一次對(duì)多個(gè)字段進(jìn)行運(yùn)算,例如:
SELECTprice*ytd_sales"totalrevenue,fFROMtitles
在這個(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+nn+au_lname"authornamenFROMauthors
在這個(gè)例子中,你把字段au_fname和字段au_lname粘貼在一起,中間
用一個(gè)逗號(hào)隔開(kāi),并把查詢(xún)結(jié)果的標(biāo)題指定三authornameo這個(gè)語(yǔ)句
的執(zhí)行結(jié)果將是這樣的:
authornames
JohnsonWhite
MarjorieGreen
CherylCarson
MichaelO'Leary
DeanStraight
???
(23row(s)affected)
可以看到,SQL為你提供了對(duì)查詢(xún)結(jié)果的許多控制。你應(yīng)該在ASP編程過(guò)
程中充分利用這些優(yōu)點(diǎn)。使用SQL來(lái)操作查詢(xún)結(jié)果幾乎總是比使用有同
樣作用的腳本效率更高。
排序查詢(xún)結(jié)果
本章的介紹中曾強(qiáng)調(diào)過(guò),SQL表沒(méi)有內(nèi)在的順序。例如,從一個(gè)表中取第
二個(gè)記錄是沒(méi)有意義的。從SQL的角度看來(lái),沒(méi)有一個(gè)記錄在任何其他
記錄之前。
然而,你可以操縱一個(gè)SQL查詢(xún)結(jié)果的順序。在缺省情況下,當(dāng)記錄從
表中取出時(shí),記錄不以特定的順序出現(xiàn)。例如,當(dāng)從表authors中取出
字段aulname時(shí),查詢(xún)結(jié)果顯示成這樣:
au_lnamc
White
Green
Carson
O'Leary
Straight
(23row(s)affected)
看一列沒(méi)有特定順序的名字是很不方便的。如果把這些名字按字母順序
排列,讀起來(lái)就會(huì)容易得多。通過(guò)使用ORDERBY子句,你可以強(qiáng)制一個(gè)
查詢(xún)結(jié)果按升序排列,就像這樣:
SELECTau_lnameFROMauthorsORDERBYau_lname
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),作者名字的顯示將按字母順序排列。ORDER
BY子句將作者名字按升序排列。
你也可以同時(shí)對(duì)多個(gè)列使用ORDERBY子句。例如,如果你想同時(shí)按升序
顯示字段au_lname和字段au_fname,你需要對(duì)兩個(gè)字段都進(jìn)行排序:
SELECTau_lname,au_fnameFROMauthorsORDERBY
au_lname,au_fname
這個(gè)查詢(xún)首先把結(jié)果按au_lname字段進(jìn)行排序,然后按字段au_fname
排序。記錄將按如下的順序取出:
au_lnameau_fname
BennetAbraham
RingerAlbert
RingerAnne
SmithMeander
???
(23row(s)affected)
注意有兩個(gè)作者有相同的名字Ringer。名為AlbertRinger的作者出現(xiàn)
名為AnneRinger的作者之前,這是因?yàn)樾誂lbert按字母順序應(yīng)排在姓
Anne之前。
如果你想把查詢(xún)結(jié)果按相反的順序排列,你可以使用關(guān)鍵字DESC。關(guān)鍵
字DESC把查詢(xún)結(jié)果按降序排列,如下例所示:
SELECTau_lname,au_fnameFROMauthors
WHEREau_lname=/,Ringer"ORDERBYau_lname,au_fnameDESC
這個(gè)查詢(xún)從表authors中取出所有名字為Ringer的作者記錄。ORDERBY
子句根據(jù)作者的名字和姓,將查詢(xún)結(jié)果按降序排列。結(jié)果是這樣的:
au_lnameau_fname
RingerAnne
RingerAlbert
(2row(s)affectec)
注意在這個(gè)表中,姓Anne出現(xiàn)在姓Albert之前。作者名字按降序顯
不O
你也可以按數(shù)值型字段對(duì)一個(gè)查詢(xún)結(jié)果進(jìn)行排序。例如,如果你想按降
序取出所有書(shū)的價(jià)格,你可以使用如下的SQL查詢(xún):
SELECTpriceFROMtitlesORDERBYpriceDESC
這個(gè)SELECT語(yǔ)句從表中取出所有書(shū)的價(jià)格,顯示結(jié)果時(shí),價(jià)格低的書(shū)先
顯示,價(jià)格高的書(shū)后顯示。
警告:
不是特別需要時(shí),不要對(duì)查詢(xún)結(jié)果進(jìn)行排序,因?yàn)樾谄魍瓿蛇@項(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):
SELCETDISTINCTauInameFROMauthorsWHEREau_lname=HRinger,f
當(dāng)這個(gè)SELECT語(yǔ)句執(zhí)行時(shí),只返回一個(gè)記錄。通過(guò)在SELECT語(yǔ)句中包
含關(guān)鍵字DISTINCT,你可以刪除所有重復(fù)的值。例如,假設(shè)有一個(gè)關(guān)于
新聞組信息發(fā)布的表,你想取出所有曾在這個(gè)新聞組中發(fā)布信息的人的
名字,那么你可以使用關(guān)鍵字DISTINCT。每個(gè)用戶(hù)的名字只取一次——
盡管有的用戶(hù)發(fā)布了不止一篇信息。
警告:
如同ORDERBY子句一樣,強(qiáng)制效勞器返回互不相同的值也會(huì)增加運(yùn)行開(kāi)
銷(xiāo)。福氣不得不花費(fèi)一些時(shí)間來(lái)完成這項(xiàng)工作。因此,不是必須的時(shí)候
不要使用關(guān)鍵字DISTINCTo
創(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_lname,這個(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_lname存儲(chǔ)的是字符型數(shù)據(jù)。一個(gè)字段也可以存儲(chǔ)其它類(lèi)型的數(shù)據(jù)。
使用SQLSovor,創(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數(shù)據(jù)操作基礎(chǔ)(初級(jí))4
netnova于99-6-2713:59:45加貼在數(shù)據(jù)庫(kù)探討:
用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)查詢(xún)窗口
后,從窗口頂部的下拉列表中選擇你在第三章所創(chuàng)立的數(shù)據(jù)庫(kù)。下一
步,在查詢(xún)窗口中鍵入下面的SQL語(yǔ)句,單擊執(zhí)行查詢(xún)按鈕,執(zhí)行這個(gè)
語(yǔ)句:
CREATETABLEguestbook(visitorVARCHAR(40),comments
TEXT,enliydcile
DATETIME)
如果一切正常,你會(huì)在結(jié)果窗口中看到如下的文字(如果出現(xiàn)異常,請(qǐng)
參閱第三章):
Thiscommandditnotreturndata,anditdidnotreturnany
rows
祝賀你,你已經(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)中的各字段的名稱(chēng)和
屬性,相互之間用逗號(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è)專(zhuān)門(mén)的表達(dá)式。例如,字段名comments
后面跟有表達(dá)式TEXT。這個(gè)表達(dá)式指定了字段的數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型決
定了一個(gè)字段可以存儲(chǔ)葉么樣的數(shù)據(jù)。因?yàn)樽侄蝐omments包含文本信
息,其數(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(visitorVARCHAR(40),comments
TEXT,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)?,只保存四十個(gè)字符。
VARCHAR類(lèi)型可以存儲(chǔ)的字符串最長(zhǎng)為255個(gè)字符。要存儲(chǔ)更長(zhǎng)的字符串
數(shù)據(jù),可以使用文本型數(shù)據(jù)(下一節(jié)中講述)。
另一種字符型數(shù)據(jù)用來(lái)存儲(chǔ)固定長(zhǎng)度的字符數(shù)據(jù)。下面是一個(gè)使用這種
數(shù)據(jù)類(lèi)型的例子:
CREATETABLEguestbook(visitorCHAR(40),comments
TEXT,entrydate
DATETIME)
在這個(gè)例子中,字段visitor被用來(lái)存儲(chǔ)四十個(gè)字符的固定長(zhǎng)度字符
串。表達(dá)式CHAR指定了這個(gè)字段應(yīng)該是固定長(zhǎng)度的字符串。
VARCHAR型和CHAR型數(shù)據(jù)的這個(gè)差異是細(xì)微的,但是非常重要。假設(shè)你
向一個(gè)長(zhǎng)度為四十個(gè)字符的VARCHAR型字段中輸入數(shù)據(jù)BillGateso當(dāng)
你以后從這個(gè)字段中取出此數(shù)據(jù)時(shí),你取出的數(shù)據(jù)其長(zhǎng)度為十個(gè)字符一
一字符串BillGates的長(zhǎng)度。
現(xiàn)在假設(shè)你把字符串輸入一個(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)空間。當(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),comments
TEXT,entrydate
DATETIME)
在這個(gè)例子中,字段commonts被用來(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ǔ)于文本型字段中。但是,無(wú)論何時(shí),只要你能防止
使用文本型字段,你就應(yīng)該不適用它。文本型字段既大且慢,濫用文本
型字段會(huì)使效勞器速度變慢。文本型字段還會(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(visitorVARCHAR(40),numvisitsINT)
這個(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ǔ)從0到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)型。
為了能對(duì)字段所存放的數(shù)據(jù)有更多的控制,你可以使用NUMERIC型數(shù)據(jù)
來(lái)同時(shí)表示一個(gè)數(shù)的整數(shù)局部和小數(shù)局部。NUMERIC型數(shù)據(jù)使你能表示非
常大的數(shù)——比INT型數(shù)據(jù)要大得多。一個(gè)NUMERIC型字段可以存儲(chǔ)從-
1038到1038范圍內(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ù)必須
小于或等于整數(shù)局部的位數(shù),小數(shù)局部可以是零。
你可以使用INT型或NUMERIC型數(shù)據(jù)來(lái)存儲(chǔ)錢(qián)數(shù)。但是,專(zhuān)門(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)該用SMALLMONEY型來(lái)代替MONEY型數(shù)
據(jù),以節(jié)省空間。下面的例子顯示了如何使用這兩種表示錢(qián)的數(shù)據(jù)類(lèi)
型:
CREATETABLEproducts(productVARCHAR(40),priceMONEY,
Discount_priceSMALLMONEY)
這個(gè)表可以用來(lái)存儲(chǔ)商品的折扣和普通售價(jià)。字段price的數(shù)據(jù)類(lèi)型是
MONEY,字段discount_price的數(shù)據(jù)類(lèi)型是SMALLMONEYo
存儲(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。反之,如果他們投N0,就在字段中存入0(在下一章里,你將學(xué)會(huì)
如何計(jì)算投票)C
留和,在你創(chuàng)立好一個(gè)表之后,你不能向表中添加BIT型字段。如果你
打算在一個(gè)表中包含BIT型字段,你必須在創(chuàng)立表時(shí)完成。
存儲(chǔ)日期和時(shí)間
當(dāng)你建立一個(gè)網(wǎng)點(diǎn)時(shí),你也許需要記錄在一段時(shí)間內(nèi)的訪問(wèn)者數(shù)量。為
了能夠存儲(chǔ)日期和時(shí)間,你需要使用DATETIME型數(shù)據(jù),如下例所示:
CREATETABLvisitorlog(visitorVARCHAR(40),arrivaltime
DATETIME,
departuretimeDATETIME)
這個(gè)表可以用來(lái)記錄訪問(wèn)者進(jìn)入和離開(kāi)你網(wǎng)點(diǎn)的時(shí)間和日期。一個(gè)
DATETIME型的字段可以存儲(chǔ)的日期范圍是從1753年1月1EJ第一毫
秒到9999年12月31日最后一毫秒。
如果你不需要覆蓋這么大范圍的日期和時(shí)間,你可以使用SMALLDATETIME
型數(shù)據(jù)。它與DATETIME型數(shù)據(jù)同樣使用,只不過(guò)它能表示的日期和時(shí)間
范圍比DATETIME型數(shù)捱小,而且不如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á)式NULLO
例如,下面的表中兩個(gè)字段都允許接受空值:
CREATETABLEempty(emptylCHAR(40)NULL,empty2INTNULL(
注意:
BIT型數(shù)據(jù)不能是空值。一個(gè)這種類(lèi)型的字段必須取0或者1。
有時(shí)你需要禁止一個(gè)字段使用空值。例如,假設(shè)有一個(gè)表存儲(chǔ)著信用卡
號(hào)碼和信用卡有效日期,你不會(huì)希望有人輸入一個(gè)信用卡號(hào)碼但不輸入
有效日期。為了強(qiáng)制兩個(gè)字段都輸入數(shù)據(jù),你可以用下面的方法建立這
個(gè)表:
CREATETABLEcreditcards(creditcardnumberCHAR(20)NOTNULL,
Creditcard_expireDATETIMENOTNULL)
注意字段定義的后面跟有表達(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ò)誤警告可以為程序調(diào)試提供有價(jià)值的線
索。
缺省值
假設(shè)有一個(gè)存儲(chǔ)地址信息的表,這個(gè)表的字段包括街道、城市、州、郵
政編碼和國(guó)家。如果你預(yù)計(jì)地址的大局部是在美國(guó),你可以把這個(gè)值作
為country字段的缺省值。
為了在創(chuàng)立一個(gè)表時(shí)指定缺省值,你可以使用表達(dá)式DEFAULT。請(qǐng)看下面
這個(gè)在創(chuàng)立表時(shí)使用缺省值的例子:
CREATETABLEaddresses(streetVARCHAR(60)NULL,
cityVARCHAR(40)NULL,
stateVARCHAR(20)NULL
zipVARCHAR(20)NULL,
countryVARCHAR(30)DEFAULT'USA')
在這個(gè)例子中,字段county的缺省值被指定為美國(guó)。注意單引號(hào)的使
用,引號(hào)指明這是字符型數(shù)據(jù)。為了給非字符型的字段指定缺省值,不
要把該值擴(kuò)在引號(hào)中:
CREATETABLEorders(priceMONEYDEFAULT$38.00,
quantityINTDEFAULT50,
entrydateDATETIMEDEFAULTGETDATE())
在這個(gè)CREATETABLE語(yǔ)句中,每個(gè)字段都指定了一個(gè)缺省值。注意
DATETIME型字段entrydate所指定的缺省值,該缺省值是函數(shù)Getdate()
的返回值,該函數(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_idjobdesc
NewHireJobnotspecified
ChiefExecutiveofficer
BushnessOperationsManager
ChiefFinancialOfficier
Publisher
字段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è)例
子:
CREATETABLEvisitorlD(thelDNUBERIC(18)IDENTITY,name
VARCHAR(40))
這個(gè)語(yǔ)句所創(chuàng)立的表包含一個(gè)名為theid的標(biāo)識(shí)字段。每當(dāng)一個(gè)新的訪
問(wèn)者名字添加到這個(gè)表中時(shí),這個(gè)字段就被自動(dòng)賦給一個(gè)新值。你可以
用這個(gè)表為你的站點(diǎn)的每一個(gè)用戶(hù)提供唯一標(biāo)識(shí)。
技巧:
建立一個(gè)標(biāo)示字段時(shí),注意使用足夠大的數(shù)據(jù)類(lèi)型。例如你使用TINYINT
型數(shù)據(jù),那么你只能向表中添加255個(gè)記錄。如果你預(yù)計(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數(shù)據(jù)操作基礎(chǔ)(初級(jí))5
netnova于99-6-2714:00:23加貼在數(shù)據(jù)庫(kù)探討:
使用SQL事務(wù)管理器創(chuàng)立新表
你可以使用前面幾節(jié)所講的方法創(chuàng)立新表。但是,使用事務(wù)管理器創(chuàng)立
新表會(huì)更容易。這一節(jié)介紹如何使用這個(gè)程序創(chuàng)立新表。
從任務(wù)欄的SQLSever程序組中選擇SQLEnterpriseManager,啟動(dòng)該
程序,你會(huì)看到如圖10.4所示的窗口。瀏覽效勞管理器窗口中的樹(shù)形結(jié)
構(gòu),選擇名為Database的文件夾。翻開(kāi)文件夾Database后,選擇你在
第三章中所建立的數(shù)據(jù)庫(kù)。
注意:
如果你還沒(méi)有創(chuàng)立自己的數(shù)據(jù)庫(kù),回到第三章創(chuàng)立它。你決不要向
master,tempdb或任何其它系統(tǒng)數(shù)據(jù)庫(kù)中添加數(shù)據(jù)。
在選擇了數(shù)據(jù)庫(kù)之后,你會(huì)看到一個(gè)名為Group/users的文件夾和一個(gè)
名為objects的文件夾。翻開(kāi)文件夾objects,你會(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,Nul1s和Defaulto
ManagerTables窗口中的每一行標(biāo)明表中一個(gè)字段的信息。
圖10.4
10.5
要建立一個(gè)新表,你至少要輸入一行信息。在名為ColumnName的列下
面鍵入mycolumn。下一步,選擇Datatype列,并從下拉列表中選擇
CHARo當(dāng)你在這兩個(gè)列中輸入信息后,窗口招是如圖10.6所示的樣子。
圖10.6
你已經(jīng)建立了一個(gè)只有一個(gè)字段的簡(jiǎn)單的表。單擊保存按扭保存這個(gè)新
表。當(dāng)要求你輸入新表的名字時(shí),輸入mytable并單擊0K?,F(xiàn)在這個(gè)表
已經(jīng)保存到了你的數(shù)據(jù)庫(kù)中。
如果你翻開(kāi)效勞管理器窗口中的文件夾Tables,你會(huì)看到你所建立的新
表被列出。你可以雙擊該表的圖表來(lái)編輯它,這時(shí)ManagerTables窗口
會(huì)重新出現(xiàn),你可以增加新的字段并重新保存。
用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è)稱(chēng)為MicrosoftQuery的客戶(hù)端
應(yīng)用程序,這個(gè)程序使得向表中添加數(shù)據(jù)變得容易了。
啟切位于任務(wù)欄SQLSever程序組中的MicrosoftQuery程序。從窗口
頂部的菜單中選擇Queryo這時(shí)會(huì)顯示一個(gè)SelectDataSource對(duì)話框
(見(jiàn)圖10.7)。選擇你的數(shù)據(jù)源名字并單擊Use。
圖10o7
輸入你的登錄帳號(hào)和密碼后,程序要求你選擇一個(gè)表和一個(gè)數(shù)據(jù)庫(kù)。選
擇你在上一節(jié)中所建立的表(mytable),單擊按鈕Add,然后單擊按鈕
Close關(guān)閉該對(duì)話框。
在窗口的左上角會(huì)出現(xiàn)一個(gè)對(duì)話框,框中是取自表mytable的一列字段
名。你可以雙擊任何一個(gè)字段,把它添加到主窗口中。如果你雙擊星號(hào)
(*)字符,所有的字段都會(huì)被添加到主窗口中。
如果你的表中有記錄,它們現(xiàn)在已經(jīng)出現(xiàn)在主窗口的字段標(biāo)題下面了。
但是,因?yàn)槟銊倓偨⒘诉@個(gè)表,表還是空的。要添加新記錄,選擇
Records|AllowEditing,主窗口中就會(huì)出現(xiàn)一條新記錄。輸入一行數(shù)據(jù)
完成這個(gè)記錄,就向表中添加了一條新記錄。
圖10o8
當(dāng)你轉(zhuǎn)到下一條新記錄時(shí),你向上一條記錄中輸入的值會(huì)自動(dòng)被保存。
如果你需要,你可以用MicrosoftQuery向表中輸入幾百條記錄。
刪除和修改表
你應(yīng)該在建立表之前仔細(xì)設(shè)計(jì)它們,因?yàn)槟阍诟淖円粋€(gè)已經(jīng)存在的表時(shí)
會(huì)受到很大的限制。例如,一旦已經(jīng)建立了一個(gè)表,你就不能刪除表中
的字段或者改變字段的數(shù)據(jù)類(lèi)型。在這種情況你所能做的是刪除這個(gè)
表,然后重頭開(kāi)始(參見(jiàn)第十一章“中級(jí)SQL〃中的“使用SQL創(chuàng)立記錄
和表〃一節(jié))。
要?jiǎng)h除一個(gè)表,你可以使用SQL語(yǔ)句DROPTABLE。例如,又從數(shù)據(jù)庫(kù)中
徹底刪除表mytable,你要使用如下的語(yǔ)句:
DROPTABLEmytable
警告:
使用DROPTABLE命令時(shí)一定要小心。一旦一個(gè)表被刪除之后,你將無(wú)法
恢復(fù)它。
當(dāng)你建設(shè)一個(gè)站點(diǎn)時(shí),你很可能需要向數(shù)據(jù)庫(kù)中輸入測(cè)試數(shù)據(jù)。而當(dāng)你
準(zhǔn)備向世界提供你的網(wǎng)點(diǎn)時(shí),你會(huì)想清空表中的這些測(cè)試信息。如果你
想去除表中的所有數(shù)據(jù)但不刪除這個(gè)表,你可以使用TRUNCATETABLE語(yǔ)
句。例如,下面的這個(gè)SQL語(yǔ)句從表mytable中刪除所有數(shù)據(jù):
TRUNCATETABLEmytable
雖然你不能刪除和修改已經(jīng)存在的字段,但你可以增加新字段。最容易
的實(shí)現(xiàn)方法是使用SQL事務(wù)管理器中的ManagerTables窗口。你也可以
使用SQL語(yǔ)句ALTERTABLEo下面是一個(gè)如何使用這種語(yǔ)句的例子:
ALTERTABLEmytableADDmynewcolumnINTNULL
這個(gè)語(yǔ)句向表mytable中增加了一個(gè)新字段mynewcolumn。當(dāng)你增加新字
段時(shí),你必須允許它接受空值,因?yàn)楸碇性瓉?lái)可能已經(jīng)有了許多記錄。
總結(jié)
這一章向你介紹了SQLo使用SQL,你可以操作MicrosoftSQLSever數(shù)
據(jù)庫(kù)。你已經(jīng)學(xué)會(huì)了使用SELECT語(yǔ)句從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),你還學(xué)會(huì)了
怎樣使用CREATETABLE語(yǔ)句和SQL事務(wù)管理器來(lái)創(chuàng)立新表。最后,你學(xué)
會(huì)了如何指明一系列重要的字段屬性。
下一章將介紹如何使用索引來(lái)增強(qiáng)SQL查詢(xún)的操作。還將通過(guò)許多其它
的SQL語(yǔ)句和函數(shù),使你的SQL知識(shí)得到進(jìn)一步擴(kuò)充。
SQL數(shù)據(jù)操作基礎(chǔ)(中級(jí))6
netnova于99-6-2714:01:09加貼在數(shù)據(jù)庫(kù)探討:
第十章“SQL基礎(chǔ)〃向你初步介紹了SQL。你學(xué)會(huì)了如何用SELECT語(yǔ)句
進(jìn)行杳詢(xún),你還學(xué)會(huì)了如何建立自己的表仁在這一章里,你將加深你的
SQL知識(shí)。你將學(xué)習(xí)如何建立索引來(lái)加快查詢(xún)速度。你還將學(xué)會(huì)如果用更
多的SQL語(yǔ)句和函數(shù)來(lái)操作表中的數(shù)據(jù)。
建立索引
假設(shè)你想找到本書(shū)中的某一個(gè)句子。你可以一頁(yè)一頁(yè)地逐頁(yè)搜索,但這
會(huì)花很多時(shí)間。而通過(guò)使用本書(shū)的索引,你可以很快地找到你要搜索的
主題。
表的索引與附在一本書(shū)后面的索引非常相似。它可以極大地提高查詢(xún)的
速度。對(duì)一個(gè)較大的表來(lái)說(shuō),通過(guò)加索引,一個(gè)通常要花費(fèi)幾個(gè)小時(shí)來(lái)
完成的查詢(xún)只要幾分鐘就可以完成。因此沒(méi)有理由對(duì)需要頻繁查詢(xún)的表
增加索引。
注意:
當(dāng)你的內(nèi)存容量或硬盤(pán)空間缺乏時(shí),也許你不想給一個(gè)表增加索引。對(duì)
于包含索引的數(shù)據(jù)庫(kù),SQLSever需要一個(gè)可觀的額外空間。例如,要建
立一個(gè)聚簇索引,需要大約1.2倍于數(shù)據(jù)大小的空間。要看一看一個(gè)表
的索引在數(shù)據(jù)庫(kù)中所占的空間大小,你可以使用系統(tǒng)存儲(chǔ)過(guò)程
sp_spaceused,對(duì)象名指定為被索引的表名。
聚簇索引和非聚簇索引
假設(shè)你已經(jīng)通過(guò)本書(shū)的索引找到了一個(gè)句子所在的頁(yè)碼。一旦已經(jīng)知道
了頁(yè)碼后,你很可能漫無(wú)目的翻尋這本書(shū),直至找到正確的頁(yè)碼。通過(guò)
隨機(jī)的翻尋,你最終可以到達(dá)正確的頁(yè)碼。但是,有一種找到頁(yè)碼的更
有效的方法。
首先,把書(shū)翻到大概一半的地方,如果要找的頁(yè)碼比半本書(shū)處的頁(yè)碼
小,就書(shū)翻到四分之一處,否則,就把書(shū)翻到四分之三的地方。通過(guò)這
種方法,你可以繼續(xù)把書(shū)分成更小的局部,直至找到正確的頁(yè)碼附近。
這是找到書(shū)頁(yè)的非常有效的一種方法。
SQLSever的表索引以類(lèi)似的方式工作。一個(gè)表索引由一組頁(yè)組成,這些
頁(yè)構(gòu)成了一個(gè)樹(shù)形結(jié)構(gòu)。根頁(yè)通過(guò)指向另外兩個(gè)頁(yè),把一個(gè)表的記錄從
邏輯上分成和兩個(gè)局部。而根頁(yè)所指向的兩個(gè)頁(yè)又分別把記錄分割成更
小的局部。每個(gè)頁(yè)都把記錄分成更小的分割,直至到達(dá)葉級(jí)頁(yè)。
索引有兩種類(lèi)型:聚簇索引和非聚簇索引。在聚簇索引中,索引樹(shù)的葉
級(jí)頁(yè)包含實(shí)際的數(shù)據(jù):記錄的索引順序與物理順序相同。在非聚簇索引
中,葉級(jí)頁(yè)指向表中的記錄:記錄的物理順序與邏輯順序沒(méi)有必然的聯(lián)
系。
聚簇索引非常象目錄表,目錄表的順序與實(shí)際的頁(yè)碼順序是一致的。非
聚簇索引則更象書(shū)的標(biāo)準(zhǔn)索引表,索引表中的順序通常與實(shí)際的頁(yè)碼順
序是不一致的。一本書(shū)也許有多個(gè)索引。例如,它也許同時(shí)有主題索引
和作者索引。同樣,一個(gè)表可以有多個(gè)非聚簇索引。
通常情況下,你使用的是聚簇索引,但是你應(yīng)該對(duì)兩種類(lèi)型索引的優(yōu)缺
點(diǎn)塞有所理解。
每個(gè)表只能有一個(gè)聚簇索引,因?yàn)橐粋€(gè)表中的記錄只能以一種物理順序
存放。通常你要對(duì)一個(gè)表按照標(biāo)識(shí)字段建立聚簇索引。但是,你也可以
對(duì)其它類(lèi)型的字段建立聚簇索引,如字符型,數(shù)值型和日期時(shí)間型字
段。
從建立了聚簇索引的表中取出數(shù)據(jù)要比建立了非聚簇索引的表快。當(dāng)你
需要取出一定范圍內(nèi)的數(shù)據(jù)時(shí),用聚簇索引也比用非聚簇索引好。例
如,假設(shè)你用一個(gè)表來(lái)記錄訪問(wèn)者在你網(wǎng)點(diǎn)上的活動(dòng)。如果你想取出在
一定時(shí)間段內(nèi)的登錄信息,你應(yīng)該對(duì)這個(gè)表的DATETIME型字段建立聚簇
索引。
對(duì)聚簇索引的主要限制是每個(gè)表只能建立一個(gè)聚簇索引。但是,一個(gè)表
可以有不止一個(gè)非聚簇索引。實(shí)際上,對(duì)每個(gè)表你最多可以建立249個(gè)
非聚簇索引。你也可以對(duì)一個(gè)表同時(shí)建立聚簇索引和非聚簇索引。
假設(shè)你不僅想根據(jù)日期,而且想根據(jù)用戶(hù)名從你的網(wǎng)點(diǎn)活動(dòng)日志中取數(shù)
據(jù)。在這種情況下,同時(shí)建立一個(gè)聚簇索引和非聚簇索引是有效的。你
可以對(duì)日期時(shí)間字段建立聚簇索引,對(duì)用戶(hù)名字段建立非聚簇索引。如
果你發(fā)現(xiàn)你需要更多的索引方式,你可以增加更多的非聚簇索引。
非聚簇索引需要大量的硬盤(pán)空間和內(nèi)存。另外,雖然非聚簇索引可以提
高從表中取數(shù)據(jù)的速度,它也會(huì)降低向表中插入和更新數(shù)據(jù)的速度。每
當(dāng)你改變了一個(gè)建立了非聚簇索引的表中的數(shù)據(jù)時(shí),必須同時(shí)更新索
引。因此你對(duì)一個(gè)表建立非聚簇索引時(shí)要慎重考慮。如果你預(yù)計(jì)一個(gè)表
需要頻繁地更新數(shù)據(jù),那么不要對(duì)它建立太多非聚簇索引。另外,如果
硬盤(pán)和內(nèi)存空間有限,也應(yīng)該限制使用非聚簇索引的數(shù)量。
索引屬性
這兩種類(lèi)型的索引都有兩個(gè)重要屬性:你可以用兩者中任一種類(lèi)型同時(shí)
對(duì)多個(gè)字段建立索引(復(fù)合索引);兩種類(lèi)型的索引都可以指定為唯一
索引。
你可以對(duì)多個(gè)字段建立一個(gè)復(fù)合索引,甚至是復(fù)合的聚簇索引。假設(shè)有
一個(gè)表記錄了你的網(wǎng)點(diǎn)訪問(wèn)者的姓和名字。如果你希望根據(jù)完整姓名從
表中取數(shù)據(jù),你需要建立一個(gè)同時(shí)對(duì)姓字段和名字字段進(jìn)行的索引。這
和分別對(duì)兩個(gè)字段建立單獨(dú)的索引是不同的。當(dāng)你希望同時(shí)對(duì)不止一個(gè)
字段進(jìn)行查詢(xún)時(shí),你應(yīng)該建立一個(gè)對(duì)多個(gè)字段的索引。如果你希望對(duì)各
個(gè)字段進(jìn)行分別查詢(xún),你應(yīng)該對(duì)各字段建立獨(dú)立的索引。
兩種類(lèi)型的索引都可以被指定為唯一索引。如果對(duì)一個(gè)字段建立了唯一
索引,你將不能向這個(gè)字段輸入重復(fù)的值。一個(gè)標(biāo)識(shí)字段會(huì)自動(dòng)成為唯
一值字段,但你也可以對(duì)其它類(lèi)型的字段建立唯一索引。假設(shè)你用一個(gè)
表來(lái)保存你的網(wǎng)點(diǎn)的用戶(hù)密碼,你當(dāng)然不希望兩個(gè)用戶(hù)有相同的密碼。
通過(guò)強(qiáng)制一個(gè)字段成為唯一值字段,你可以防止這種情況的發(fā)生。
SQL數(shù)據(jù)操作基礎(chǔ)(中級(jí))7
netnova于99-6-2714:01:57加貼在數(shù)據(jù)庫(kù)探討:
用SQL建立索引
為了給一個(gè)表建立索引,啟動(dòng)任務(wù)欄SQLSever程序組中的ISQL/w程
序。進(jìn)入查詢(xún)窗口后,輸入下面的語(yǔ)句:
CREATEINDEXmycolumn_indexONmytable(myclumn)
這個(gè)語(yǔ)句建立了一個(gè)名為mycolumn_index的索引。你可以給一個(gè)索引起
任何名字,但你應(yīng)該在索引名中包含所索引的字段名,這對(duì)你將來(lái)弄清
楚建立該索引的意圖是有幫助的。
注意:
在本書(shū)中你執(zhí)行任何SQL語(yǔ)句,都會(huì)收到如下的信息:
Thiscommanddidnotreturndata,anditdidnotreturnanyrows
這說(shuō)明該語(yǔ)句執(zhí)行成功了。
索引mycolumnindex對(duì)表mytable的mycolumn字段進(jìn)行。這是個(gè)非聚
簇索引,也是個(gè)非唯一索引。(這是一個(gè)索引的缺省屬性)
如果你需要改變一個(gè)索引的類(lèi)型,你必須刪除原來(lái)的索引并重建一個(gè)。
建立了一個(gè)索引后,你可以用下面的SQL語(yǔ)句刪除它:
DROPINDEXmytable.mycolumnindex
注意在DROPINDEX語(yǔ)句中你要包含表的名字。在這個(gè)例子中,你刪除的
索引是mycolumn_index,它是表mytable的索引。
要建立一個(gè)聚簇索引,可以使用關(guān)鍵字CLUSTERED。)記住一個(gè)表只能有
一個(gè)聚簇索引。(這里有一個(gè)如何對(duì)一個(gè)表建立聚簇索引的例子:
CREATECLUSTEREDINDEXmycolumn_clust_indexONmytab1e(myco1umn)
如果表中有重復(fù)的記錄,當(dāng)你試圖用這個(gè)語(yǔ)句建立索引時(shí),會(huì)出現(xiàn)錯(cuò)
誤。但是有重復(fù)記錄的表也可以建立索引;你只要使用關(guān)鍵字
ALLOW_DUP_ROW把這一點(diǎn)告訴SQLSever即可:
CREATECLUSTEREDINDEXmycolumn_cindexONmytable(mycolumn)
WITHALLOW_DUP_ROW
這個(gè)語(yǔ)句建立了一個(gè)允許重復(fù)記錄的聚簇索引。你應(yīng)該盡量防止在一個(gè)
表中出現(xiàn)重復(fù)記錄,但是,如果已經(jīng)出現(xiàn)了,你可以使用這種方法C
要對(duì)一個(gè)表建立唯一索引,可以使用關(guān)鍵字UNIQUE。對(duì)聚簇索引和非聚
簇索引都可以使用這個(gè)關(guān)鍵字。這里有一個(gè)例子:
CREATEUNIQUECOUSTEREDINDEXmyclumn_cindexON
mytable(mycolumn)
這是你將經(jīng)常使用的索引建立語(yǔ)句。無(wú)論何時(shí),只要可以,你應(yīng)該盡量
對(duì)一個(gè)對(duì)一個(gè)表建立唯一聚簇索引來(lái)增強(qiáng)查詢(xún)操作。
最后,要建立一個(gè)對(duì)多個(gè)字段的索引——復(fù)合索引——在索引建立語(yǔ)句
中同時(shí)包含多個(gè)字段名。下面的例子對(duì)firstname和lastname兩個(gè)字段
建立索引:
CREATEINDEXnameindexONusername(firstname,lastname)
這個(gè)例子對(duì)兩個(gè)字段建立了單個(gè)索引。在一個(gè)復(fù)合索引中,你最多可以
對(duì)16個(gè)字段進(jìn)行索引。
用事務(wù)管理器建立索引
用事務(wù)管理器建立索引比用SQL語(yǔ)句容易的多。使用事務(wù)管理器,你可
以看到已經(jīng)建立的索引的列表,并可以通過(guò)圖形界面選擇索引選項(xiàng)。
使用事務(wù)管理器你可以用兩種方式建立索引:使用ManageTables窗口
或使用ManageIndexes窗口。
要用ManageTables窗口建立一個(gè)新索引,單擊按鈕Advanced
Options(它看起來(lái)象一個(gè)前面有一加號(hào)的表)。這樣就翻開(kāi)了Advanced
Options對(duì)話框。這個(gè)對(duì)話框有一局部標(biāo)名為PrimaryKey(見(jiàn)圖
11.1)O
圖llo1
要建立一個(gè)新索引,從下拉列表中選擇你想對(duì)之建立索引的字段名。如
果你想建立一個(gè)對(duì)多字段的索引,你可以選擇多個(gè)字段名。你還可以選
擇索引是聚簇的還是非
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考總復(fù)習(xí)優(yōu)化設(shè)計(jì)二輪用書(shū)英語(yǔ)A 考點(diǎn)分類(lèi)練9 詞句猜測(cè)題
- 辦公樓轉(zhuǎn)讓補(bǔ)充條款合同協(xié)議2025年
- 辦公燈具日常保潔服務(wù)合同協(xié)議2025
- 基因編輯治療潛力
- 2025年河北省公需課學(xué)習(xí)-《中華人民共和國(guó)稅收征收管理法》實(shí)施解讀
- 2025年八大特殊作業(yè)安全知識(shí)考試題及答案(共70題)
- 歌曲猜名字測(cè)試題及答案
- 第六單元 第28課時(shí) 與圓有關(guān)的計(jì)算
- 濱州幼兒面試真題及答案
- 2025年南通三模歷史試卷及答案
- 血透失衡綜合征的護(hù)理課件
- 2025年服飾時(shí)尚行業(yè)數(shù)字化轉(zhuǎn)型研究報(bào)告
- 物流搬運(yùn)工合同范本
- 2025年心肺復(fù)蘇指南課件
- 2025年湖北省宜昌市新質(zhì)生產(chǎn)力發(fā)展研判:聚焦“3+2”主導(dǎo)產(chǎn)業(yè)打造長(zhǎng)江經(jīng)濟(jì)帶新質(zhì)生產(chǎn)力發(fā)展示范區(qū)圖
- 2025 小學(xué)二年級(jí)數(shù)學(xué)上冊(cè)解決問(wèn)題審題方法課件
- 老年患者術(shù)后加速康復(fù)外科(ERAS)實(shí)施方案
- 2024-2025學(xué)年廣州市越秀區(qū)八年級(jí)上學(xué)期期末歷史試卷(含答案)
- 2025年餐飲與管理考試題及答案
- 2025事業(yè)單位考試公共基礎(chǔ)知識(shí)測(cè)試題及答案
- M蛋白血癥的護(hù)理
評(píng)論
0/150
提交評(píng)論