SQL基礎(chǔ)知識(shí)資料_第1頁(yè)
SQL基礎(chǔ)知識(shí)資料_第2頁(yè)
SQL基礎(chǔ)知識(shí)資料_第3頁(yè)
SQL基礎(chǔ)知識(shí)資料_第4頁(yè)
SQL基礎(chǔ)知識(shí)資料_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論