SQL基礎知識資料_第1頁
SQL基礎知識資料_第2頁
SQL基礎知識資料_第3頁
SQL基礎知識資料_第4頁
SQL基礎知識資料_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SQL基礎知識

本部分內容

■SQL基礎

■中級SQL

■高級SQL

第10章SQL基礎

本章內容

SQL介紹

使用SELECT語句從表中取數據

創(chuàng)建新表

字段屬性

向表中添加數據

刪除與修改表

為了建立交互站點,你需要使用數據庫來存儲來自訪問者昌信息。比如,你要建立i個

職業(yè)介紹服務的站點,你就需要存儲諸如個人簡歷,所感興趣的工作等等這樣的信息。創(chuàng)建

動態(tài)網葉也需要使用數據庫,假如你想顯示符合來訪者要求的最好的工作,你就需要從數據

庫中取出這份工作的信息。你將會發(fā)現,在許多情況下需要使用數據庫。

在這一章里,你將學會如何使用“結構化查詢語言”(SQL:來操作數據庫。SQL語言是

數據庫的標準語言。在AclivcSeverPages中,不管何時你要訪問一個數據庫,你就要使

用SQL語言。因此,掌握好SQL對ASP編程是非常重要的。

注意:

你能夠把“SQL”讀作“sequel",也能夠按單個字母的讀音讀作S-Q-Lo

兩種發(fā)音都是正確的,每種發(fā)音各有大量的支持者。在本書里,認為“SQL”讀作“sequel”。

通過這一章的學習,你將懂得如何用SQL實現數據庫查詢,你將學會如何使用這種查詢

從數據表中取出信息,最后,你將學會如何設計與建立自己的數據庫。

注意:

通過下面幾章對SQL的介紹,你將對SQL有足夠的熟悉,從而能夠有效地使用Active

SeverPages(>但是,SQL是一種復雜的語言,本書不可能包含它的全部細節(jié)。耍全面掌握

SQL語言,你需要學習在MicrosoftSQLSever中使用SQL。你能夠到鄰近的書店去買一本

MicrosoftSQLSever6.5。

SQL介紹:

本書假設你是在SQL操作MicrosoftSQLSever的數據庫。你也能夠用SQL操作許多

其它類型的數據庫。SQL是操作數據庫的標準語言。(事實上,關于SQL語言有一個專門的

ANSI標準)

注意:

不要在你的站點上試圖用MicrosoftAccess代替MicrosoftSQLSever0SQLSever

能夠同時服務于許多用戶,假如你希望你的站點有較高的訪問率,MSAccess是不能勝任的。

在學習SQL的細節(jié)之前,你需要懂得它的兩大特點。??個特點容易掌握,另一個掌握起

來有點困難。

第一個特點是所有SQL數據庫中的數據都存儲在表中。一個表由行與列構成。比如,下

面這個簡單的表包含name與e-mailaddress:

NameEmailAddress

這個表有兩列(列也稱之字段,域):Name與EmailAddress.有三行,每?行包含一

組數據。一行中的數據組合在一起稱之一條記錄。

不管何時你向表中添加新數據,你就添加了一條新記錄。一個數據表能夠有幾十個記錄,

也能夠有幾干甚至幾十億個記錄。盡管你也許永遠不需要存儲十億個Email地址,但明白你

能這樣做總是好的,也許有一天你會有這樣的需要。

你的數據庫很有可能包含幾十個表,所有存儲在你數據庫中的信息都被存儲在這些表

中。當你考慮如何把信息存儲在數據庫中時,你應該考慮如何壬它們存儲在表中。

SQL的第二個特點有些難于掌握。這種語言被設計為不同意你按照某種特定的順序來取

出記錄,由于這樣做會降低SQLSever取記錄的效率。使用SQL,你只能按查詢條件來讀取

記錄。

當考慮如何從表中取出記錄時,自然會想到按記錄的位置讀取它們。比如,也許你會嘗

試通過一個循環(huán),逐個記錄地掃描,來選出特定的記錄。在使用SQL時,你務必訓練自己,

不要有這種思路。

假如你想選出所有的名字是“BillGates”的記錄,假如僅用傳統(tǒng)的編程語言,你也許

會構造一個循環(huán),逐個查看表中的記錄,看名字域是否是“Bi」Gates”。

這種選擇記錄的方法是可行的,但是效率不高。使用SQL.你只要說,“選擇所有名字

域等于BillGates的記錄”,SQL就會為你選出所有符合條件的記錄。SQL會確定實現查詢

的最佳方法。

建設你想取出表中的前十個記錄。使用傳統(tǒng)的編程語言,你能夠做一個循環(huán),取出前十

個記錄后結束循環(huán)。但使用標準的SQL查詢,這是不可能實現的。從SQL的角度來說,在一

個表中不存在前十個記錄這種概念。

開始時,當你明白你不能用SQL實現某些你感受應該能實現的功能,你會受到挫折。你

也許會以頭撞地甚至想寫惡毒的信件給SQL的設計者們。但后來你會認識到,SQL的這個特

點不僅不是個限制,反而是其長處。由于SQL不根據位置來讀取記錄,它讀取記錄能夠很快。

綜上所述,SQL有兩個特點:所有數據存儲在表中,從SQL的角度來說,表中的記錄沒

有順序。在下一節(jié),你將學會如何用SQL從表中選擇特殊的記錄。

使用SQL從表中取記錄。

SQL的要緊功能之一是實現數據庫查詢。假如你熟悉Inlcrncl引擎,那么你已經熟悉

查詢了。你使用查詢來取得滿足特定條件的信息。比如,假如你想找到有ASP信息的全部站

點,你能夠連接到Yahoo!并執(zhí)行一個對ActiveSeverPages的搜索。在你輸入這個查詢后,

你會收到一個列表,表中包含所有其描述中包含搜索表達式的站點。

多數Internet引擎同意邏輯查詢。在邏輯查詢中,你能夠包含特殊的運算符如AND、

OR與)JOT,你使用這些運算符來選擇特定的記錄。比如,你能夠用AM)來限制杳詢結果。假

如你執(zhí)行一個對ActiveSeverPagesANDSQL的搜索。你將得到其描述中同時包含Active

SeverPages與SQL的記錄。當你需要限制查詢結果時,你能夠使用AND。

假如你需要擴展查詢的結果,你能夠使用邏輯操作符OR。比如,假如你執(zhí)行一個搜索,

搜索所有的其描述中包含ActiveSeverPagesORSQL的站點,你收到的列表中將包含所

有其描述中同時包含兩個表達式或者其中任何一個表達式的站點。

假如你想從搜索結果中排除特定的站點,你能夠使用NOT。比如,杳詢“ActiveSever

Pages"ANDNOT“SQL”將返回一個列表,列表中的站點包含ActiveSeverPages,但

不包含SQL。當務必排除特定的記錄時,你能夠使用NOT。

用SQL執(zhí)行的查詢與用Internet搜索引擎執(zhí)行的搜索非常相似。當你執(zhí)行一個SQL

查詢時,通過使用包含邏輯運算符的查詢條件,你能夠得到一個記錄列表。如今查詢結果是

來自一個或者多個表。

SQL查詢的句法非常簡單,假設有一個名為email_table的表,包含名字與地址兩個字

段,要得到BillGates的ejnail地址,你能夠使用下面的查詢:

SELECTemai1fromemailtableWHEREname=*Bi11Gates”

當這個杏詢執(zhí)行時,就從名為email_table的表中讀取BillGates的e_mail地址。

這個簡單的語句包含三部分:

■SELECTT語句的第二部份指明要從哪個(些)表中查詢數據。在此例中,要查詢的

表名為email_table。

■最后,SELECT語句的WHERE子句指明要選擇滿足什么條件的記錄。在此例中,查

詢條件為只有name列的值為Bi]1Gates的記錄才被選取。

BillGates很有可能擁有不止一個email地址。假如表中包含BillGates的多個email

地址。用上述的SEI.ECT語句能夠讀取他所有的email地址。SELECT語句從表中取出所有name

字段值為BillGates的記錄的email字段的值。

前面說過,查詢能夠在查詢條件中包含邏輯運算符。假如你想讀取BillGates或者

Clinton總統(tǒng)的所有email地址,你能夠使用下面的查詢語句:

SELECTemailFROMemail_tableWHEREname=*BillGates"OR

name="presidentClinton”

此例中的查詢條件比前一個復雜了一點。這個語句從表email_table中選出所有name

列為BillGates或者presidentClinton的記錄。假如表中含有BillGates或者president

Clinton的多個地址,所有的地址都被讀取。

SELECT語句的結構在起來很直觀。假如你請一個朋友從一個表中為你選擇一一組記錄,

你也許以非常相似的方式提出你的要求。在SQLSELECT語句中,你"SELECT特定的列FROM

一個表WHERE某些列滿足一個特定的條件”。

下一節(jié)將介紹如何執(zhí)行SQL查詢來選取記錄。這將幫助你熟悉用SELECT語句從表中取

數據的各類不一致方法。

使用1SQL執(zhí)行SELECT查詢

當你安裝SQLSever時,你同時安裝了一個叫作ISQL/w的應用程序。ISQL/w同意你執(zhí)

行交互的SQL查詢。在把查詢包含到你的ASP網頁中之前,用ISQL/w對其進行測試是非常

有用的。

注意:

在這本書的第一部份,你學習了如何安裝與配置MicrosoftSQLSever。假如沒有安

裝SQLSever或者者SQLSever不能運行,請參閱第三章“安裝與使用SQLSever”。

選擇任務上SQLSever程序組中的ISQL_w以啟動該程序。程序啟動時,首先會出現一

個對話框,要求輸入服務器信息與登錄信息(見圖10.Do在Sever框中,輸入你的SQL服

務器的名字。假如服務器正運行在本地計算機上,服務器名字就是你計算機的名字。在登錄

信息框中,輸入一個登錄帳號與密碼或者選擇使用“可信連接”,然后單擊Connect按鈕。

圖10。1

注意:

假如你將SQLSever配置為使用完整安全或者混合安全,那么你能夠使用可信連接。假

如你使用標準安全,你則需要提供用戶帳號與密碼。要熟悉更多信息,參見第三章。

假如一切正常,在你單擊連接按鈕后會出現一個查詢窗口,如圖10.2所示。(假如有特

殊,請參考第三章)

圖10.2

在執(zhí)行查詢之前,你需要選擇數據庫。安裝SQLSever時你已為自己創(chuàng)建了?個數據

庫,SQLSever還有許多系統(tǒng)數據庫,如master,model,msdb,與tempdb。

方便的是,SQLSever帶有一個特殊的名為pubs的例子數據庫。庫pubs中包含供一個

虛擬的出版商使用的各個表。文檔中所有的例子程序都是針對這個庫來設計的。本書中的許

多例子也使用這個數據庫。

在查詢窗口頂部的DB卜.拉框中選擇數據庫pubs,這樣你就選擇了數據庫。你所有的查

詢都將針對這個庫中的各個表來執(zhí)行?,F在你能夠執(zhí)行你的第?個查詢了。這真讓人興奮!

你的第一個查詢將針對一個名為autrors的表,表中包含所有為某個虛擬出版商工作的

作者的有關數據。單擊查詢窗口并輸入卜.列的語句:

SELECTphoneFROMauthorsWHEREau_name="Ringer”

輸入完成后,單擊執(zhí)行查詢按鈕(一個綠色三角形,看起來像VCR播放鍵)。單擊此按

鈕后,任何出現在查詢窗口中的語句均會被執(zhí)行。查詢窗口會自動變成結果顯示窗口,你能

夠看到查詢的結果(見圖10.3)o

你看到的查詢結果也許與圖10.3所示的不一致。在SQLSever的不一致版本中,庫pubs

中的數據會是完全不一致的。對SQLSever6.5來說,將會找到兩條記錄。結果顯示窗口中

應顯示如下內容:

phone

8018260752

801826_0752

(2row(s)affected)

圖10.3

你所執(zhí)行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號碼。你

通過在WHERE子句中使用特殊的選擇條件來限制查詢的結果。你也能夠忽略選擇條件,從表

中取出所有作者的電話號碼。要做到這一點,單擊Query標簽,返回到杳詢窗口,輸入下列

的SELECT語句:

SELECTPhonePROMauthors

這個查詢執(zhí)行后,會取出表authors中的所有電話號碼(沒有特定的順序)。假如表

authors中包含一百個電話號媽,會有一百個記錄被取出,假如表中有十億個電話號碼,這

十億條記錄都會被取出(這也許需要一些時間)。

表authrs的字段包含姓,名字,電話號碼,地址,城市,州與郵政編碼。通過在SELECT

語句的第一部份指定它們,你能夠從表中取出任何一個字段。你能夠在一個SELECT語句中

一次取出多個字段,比如:

SELECTau_fname,aulname,phoneFROMauthors

這個SELECT語句執(zhí)行后,將取出這三個列的所有值。下面是這個查詢的結果的一個示

例(為了節(jié)約紙張,只顯示查詢結果的一部分,其余記錄用省略號代替):

aufnameaulnamephone

JohnsonWhite408496_7223

MarjorieGreen415986_7020

CherylCarson415548_7723

MichaelO'Leary408286_2428

(23row(s)affected)

在SELECT語句中,你需要列出多少個字段,你就能夠列出多少。不要忘了把字段名用

逗號隔開。你也能夠用星號(*)從一個表中取出所有的字段。這里有一個使用星號的例子:

SELECT*FROMauthors

這個SELECT語句執(zhí)行后,表中的所有字段的值都被取出。你會發(fā)現你將在SQL查詢中

頻繁使用星號。

技巧:

你能夠使用星號來查看一個表的所有列的名字。要做到這一點,只需要在執(zhí)行完SELECT

語句后看一卜查詢結果的列標題。

操作多個表

到現在為止,你只嘗試了用一句SQL查詢從一個表中取出數據。你也能夠用一個SELECT

語句同時從多個表中取出數據,只需在SELECT語句的FROM從句中列出要從中取出數據的表

名稱即可:

SELECTau_lname,titleFROMauthors,titles

這個SELECT語句執(zhí)行時,同時從表authors與表titles中取出數據。從表authors

中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執(zhí)行這個查詢,

看一下查詢結果。你會發(fā)現?些驚奇的出乎意料的情況:作者的名字并沒有與它們所著的書

相匹配,而是出現了作者名字與書名的所有可能的組合,這也許不是你所希望見到的。

出了什么差錯?問題在于你沒有指明這兩個表之間的關系。你沒有通過任何方式告訴

SQL如何把表與表關聯在一-起,由于不明白如何關聯兩個表,服務器只能簡單地返回取自兩

個表中的記錄的所有可能組合。

要從兩個表中選出有意義的記錄組合,你需要通過建立兩表中字段的關系來關聯兩個

表。要做到這一點的途徑之?是創(chuàng)建第三個表,專門用來描述另外兩個表的字段之間的關系。

表authors有一個名為au_id的字段,包含有每個作者的唯一標識。表titles有一個

名為lilljid的字段,包含每個書名的唯一標識。假如你能在字段au_id與字段

之間建立一個關系,你就能夠關聯這兩個表。數據庫pubs中有一個名為titleauthcr的表,

正是用來完成這個工作。表中的每個記錄包含兩個字段,用來科表titles與表authors關

聯在一起。下面的SELECT語句使用了這三個表以得到正確的結果:

SELECTauname,titleFROMauthors,titles,titleauthor

WHEREauthors.au_id=titieauthor.au_id

ANDtitles.title_id=titieauthor.title_id

當這個SELECT語句執(zhí)行忖,每個作者都將與正確的書名相匹配。表titleauthor指明

了表authors與表titles的關系,它通過包含分別來自兩個表的各一個字段實現這一點。

第三個表的唯一目的是在另外兩個表的字段之間建立關系。它本身不包含任何附加數據。

注意在這個例子中字段名是如何書寫的。為了區(qū)別表authors與表titles中相同的字

段名au_id,每個字段名前面都加上了表名前綴與一個句號。名為author.au_id的字段屬

于表authors,名為titleauthor.auid的字段屬于表titleauthor,兩者不可能混淆。

通過使用第三個表,你能夠在兩個表的字段之間建立各類類型的關系。比如,一個作者

也許寫了許多不一致的書,或者者一本書也許由許多不一致的作者共同完成。當兩個表的字

段之間有這種“多對多”的關系時,你需要使用第三個表來指明這種關系。

但是,在許多情況下,兩個表之間的關系并不復雜。比圻你需要指明表titles與表

publishers之間的關系。由「一個書名不可能與多個出版商相匹配,你不需要通過第三個

表來指明這兩個表之間的關系。要指明表titles與表publishers之間的關系,你只要讓這

兩個表有?個公共的字段就能夠了。在數據庫pubs中,表titles與表publishers都有一

個名為pub_id的字段。假如你想得到書名及其出版商的一個列表,你能夠使用如下的語句:

SELECTtitle,pubnameFROMtitles,publishers

WHEREtitles,pubid=publishers.pubid

當然,假如一本書是由兩個出版商聯合出版的,那么你需要第三個表來代表這種關系。

通常,當你予先明白兩個表的字段間存在“多對多”關系時,就使用第三個表來關聯這

兩個表。反之,假如兩個表的字段間只有“一對一”或者“一對多”關系,你能夠使用公共

字段來關聯它門。

操作字段

通常,當你從一個表中取出字段值時,該值與創(chuàng)建該表時所定義的字段名聯系在一起。

假如你從表authors中選擇所有的作者名字,所有的值將會與字段名au_lname相聯系。但

是在某些情況下,你需要對字段名進行操作。在SELECT語句中,你能夠在缺省字段名后面

僅跟一個新名字來取代它。比如,能夠用一個更直觀易讀的名字AuthorLastName來代替

字段名auIname:

SELECTau_Iname"AuthorLastName"FROMauthors

當這個SELECT語句執(zhí)行時,來自字段au_Iname的值會與"AulhorLastName0相聯系。

查詢結果可能是這樣:

AuthorLastName

White

Green

Carson

OTeary

Straight

(23row(s)affected)

注意字段標題不再是au」name,而是被AuthorLastName所取代。

你也能夠通過執(zhí)行運算,來操作從一個表返回的字段值。比如,假如你想把表titles

中的所有書的價格加倍,你能夠使用卜而的SELECT語句:

SELECTprice*2FROMtitles

當這個查詢執(zhí)行時,每本書的價格從表中取出時都會加倍。但是,通過這種途徑操作字

段不可能改變存儲在表中的書價。對字段的運算只會影響SELECT語句的輸出,而不可能影

響表中的數據。為了同時顯示書的原始價格與漲價后的新價格,你能夠使用下面的查詢:

SELECTprice"Originalprice”,price*2*Newprice*FROMtitles

當數據從表titles中取出時,原始價格顯示在標題Originalprice下面,加倍后的價

格顯示在標題Newprice下面。結果可能是這樣:

originalpricenewprice

19.9939.98

11.9523.90

2.995.98

19.9939.98

(18row(s)affected)

你能夠使用大多數標準的數學運算符來操作字段值,如加(+),減(-),乘(*)與除

</)o你也能夠一次對多個字段進行運算,比如:

SELECTprice*ytd_sales"totalrevenue"FROMtitles

在這個例子中,通過把價格與銷售量相乘,計算出了每種書的總銷售額。這個SELECT

語句的結果將是這樣的:

totalrevenue

81,859,05

46,318,20

55,978,78

81,859,05

40,619,68

(18row(s)affected)

最后,你還能夠使用連接運算符(它看起來像個加號)來連接兩個字符型字段:

SELECTau_fname+*"+au_lname“authorname"FROMauthors

在這個例子中,你把字段au_fname與字段au」name粘貼在一起,中間用一個逗號隔

開,并把查詢結果的標題指定為authorname。這個語句的執(zhí)行結果將是這樣的:

authornames

JohnsonWhite

MarjorieGreen

CherylCarson

MichaelO'Leary

DeanStraight

(23row(s)affected)

能夠看到,SQL為你提供了對杳詢結果的許多操縱。你應該在ASP編程過程中充分利用

這些優(yōu)點。使用SQL來操作查詢結果幾乎總是比使用有同樣作用的腳本效率更高。

排序查詢結果

本章的介紹中曾強調過,SQL表沒有內在的順序。比如,從一個表中取第二個記錄是沒

有意義的。從SQL的角度看來,沒有一個記錄在任何其他記錄之前。

然而,你能夠操縱一個SQL查詢結果的順序。在缺省情況下,當記錄從表中取出時,記錄不

以特定的順序出現。比如,當從表authors中取出字段auInane時,查詢結果顯示成這樣:

aulname

White

Green

Carson

O,Leary

Straight

(23row(s)affected)

看一列沒有特定順序的名字是很不方便的。假如把這些名字按字母順序排列,讀起來就

會容易得多。通過使用ORDERBY子句,你能夠強制一個查詢結果按升序排列,就像這樣:

SELECTau_lnameFROMauthorsORDERBYau_lname

當這個SELECT語句執(zhí)行時,作者名字的顯示將按字母順序排列。ORDERBY子句將作者

名字按升序排列。

你也能夠同時對多個列使用ORDERBY子句。比如,假如你想同時按升序顯示字段

auIname與字段aufname,你需要對兩個字段都進行排序:

SELECTau_Iname,aufnameFROMauthorsORDERBYau.name,aufname

這個查詢首先把結果按au」nanie字段進行排序,然后按字段au_fname排序。記錄將按

如下的順序取出:

au_Inameau_fname

BennetAbraham

RingerAlbert

RingerAnne

SmithMeander

(23row(s)affected)

注意有兩個作者有相同的名字Ringer。名為AlbertRinger的作者出現名為AnneRinger

的作者之前,這是由于姓Albert按字母順序應排在姓Anne之前。

假如你想把查詢結果按相反的順序排列,你能夠使用關鍵字DESC。關鍵字DESC把查詢結果

按降序排列,如下例所示:

SELECTau_lname,au_fnameFROMauthors

WHEREau_Iname="Ringer"ORDERBYauIname,aufnameDESC

這個查詢從表authors中取出所有名字為Ringer的作者記錄。ORDERBY子句根據作者

的名字與姓,將查詢結果按降序排列。結果是這樣的:

auInameaufname

RingerAnne

RingerAlbert

(2row(s)affectec)

注意在這個表中,姓Anne出現在姓Albert之前。作者名字按降序顯示。

你也能夠按數值型字段對一個查詢結果進行排序。比如,假如你怛按降序取出所有書的價格,

你能夠使用如下的SQL查詢:

SELECTpriceFROMtitlesORDERBYpriceDESC

這個SELECT語句從表中取出所有書的價格,顯示結果時,價格低的書先顯示,價格高

的書后顯示。

警告:

不是特別需要時,不要對查詢結果進行排序,由于服務器完成這項工作要費些力氣。這

味著帶有ORDERBY子句的SELECT語句執(zhí)行起來比通常的SELECT語句花的時間長。

取出互不相同的記錄

一個表有可能在同一列中有重復的值。比如,數據庫pubs的表authors中有兩個作者

的名字是Ringer。假如你從這個表中取出所有的名字,名字Ringer將會顯示兩次。

在特定情況下,你可能只有興趣從一-個表中取出互不相同的值。假如?個字段有重復的

值,你也許希望每個值只被選取一次,你能夠使用關鍵字DISTINCT來做到這一點:

SELCETDISTINCTau_lnamcFROMauthorsWHEREau」namc="Ringcr”

當這個SELECT語句執(zhí)行時,只返回一個記錄。通過在SELECT語句中包含關鍵字

DISTINCT,你能夠刪除所有重復的值。比如,假設有一個關于新聞組信息公布的表,你想取

出所有曾在這個新聞組中公布信息的人的名字,那么你能夠使用關鍵字DISTINCT。每個用

戶的名字只取-一次一一盡管有的用戶公布了不止一篇信息。

警告:

如同ORDERBY子句一樣,強制服務器返回互不相同的值也會增加運行開銷。福氣不得

不花費一些時間來完成這項工作。因此,不是務必的時候不要使用關鍵字DISTINCT。

創(chuàng)建新表

前面說過,數據庫中的所有數據存儲在表中。數據表包含行與列。列決定了表中數據的

類型。行包含了實際的數據。

比如,數據庫pubs中的表authors有九個字段。其中的一個字段名為為au」name,這

個字段被用來存儲作者的名字信息。每次向這個表中添加新作者時,作者名字就被添加到這

個字段,產生一條新記錄。

通過定義字段,你能夠創(chuàng)建一個新表。每個字段有一個名字與一個特定的數據類型(數

據類型在后面的“字段類型”一節(jié)中講述),比如字段au」name存儲的是字符型數據。?個

字段也能夠存儲其它類型的數據。

使用SQLSever,創(chuàng)建一個新表的方法是很多的。你能夠可執(zhí)行一個SQL語句或者使用

SQL事務管理器(SQLEnterpriseManager)來創(chuàng)建一個新表。在下一節(jié)里,你將學會如何

用SQL語句來創(chuàng)建一個新表。

用SQL創(chuàng)建新表

注意:

假如你還沒有建立自己的數據庫,現在就跳回到第三章創(chuàng)建這個庫。你絕不能向

master,tempdb或者任何其他任何系統(tǒng)數據庫中添加數據。

從SQLSever程序組(在任務欄中)中啟動ISQL/w程序。出現查詢窗口后,從窗口頂

部的卜?拉列表中選擇你在第三章所創(chuàng)建的數據庫。下一步,在查詢窗口中犍入下面的SQL

語句,單擊執(zhí)行查詢按鈕,執(zhí)行這個語句:

CREATETABLEguestbook(visitorVARCHAR(40),conmentsTEXT,entrydate

DATETIME)

假如一切正常,你會在結果窗口中看到如下的文字(假如出現特殊,請參閱第三章):

Thiscommand(litnotreturndata,anditdidnotreturnanyrows

祝賀你,你已經建立了你的第一個表!

你所創(chuàng)建的表名為guestbook,你能夠使用這個表來存儲來字你站點訪問者的信息。你

是用REEATETABLE語句創(chuàng)建的這個表,這個語句有兩部分:第一部份指定表的名子:第二

部份是括在括號中的各字段的名稱與屬性,相互之間用逗號隔開。

表guestbook有三個字段:visitor,comments與entrydate。visitor字段存儲訪問者

的名字,comments字段存儲訪問者對你站點的意見,entrydate字段存儲訪問者訪問你站點

的日期與時間。

注意每個字段名后面都跟有一個專門的表達式。比如,字段名comments后面跟有表達

式TEXTO這個表達式指定了字段的數據類型。數據類型決定了一個字段能夠存儲什么樣的

數據。由于字段comments包含文本信息,其數據類型定義為文本型。

字段有許多不一致的數據類型。下一小節(jié)講述SQL所支持的一些重要的數據類型。

字段類型

不一致的字段類型用來存放不一致類型的數據。創(chuàng)建與使用表時,更你應該懂得五種常

用的字段類型:字符型,文本型,數值型,邏輯性與日期型。

字符型數據

字符型數據非常有用。當你需要存儲短的字符串信息時,你總是要用到字符型數據。比

如,你能夠把從HTMLform的文本框中搜集到的信息放在字符型字段中。

要建立一個字段用來存放可變長度的字符串信息,你能夠使用表達式VARCHARo考慮你

前而創(chuàng)建的表guestbook:

CREATETABLEguestbook(visitorV.4RCHAR(40),comnentsTEXT,entrydate

DATETIME)

在這個例子中,字段visitor的數據類型為VARCHAR。注意跟在數據類型后面的括號中

的數字。這個數字指定了這個字段所同意存放的字符串的最大長度。在這個例了?中,字段

visitor能存放的字符串最長為四十個字符。假如名字太長,字符串會被截斷,只保留四十

個字符。

VARCHAR類型能夠存儲的字符串最長為255個字符。要存儲更長的字符串數據,能夠使

用文本型數據(下一節(jié)中講述)。

另一種字符型數據用來存儲固定長度的字符數據。下而是一個使用這種數據類型的例

子:

CREATETABLEguestbock(visitorCHAR(40),commentsTEXT,entrydate

DATETIME)

在這個例子中,字段visitor被用來存儲四十個字符的固定長度字符串。表達式CHAR

指定了這個字段應該是固定長度的字符串。

VARCHAR型與CHAR型數據的這個差別是細微的,但是非常重要。假如你向一個長度為

四十個字符的VARCHAR型字段中輸入數據BillGates。當你以后從這個字段中取出此數據

時,你取出的數據其長度為十個字符一一字符串BillGates的長度。

現在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那么當你取出數據

時,所取出的數據長度將是四十個字符。字符串的后面會被附加多余的空格。

當你建立自己的站點時,你會發(fā)現使用VARCHAR型字段要比CHAR型字段方便的多。使

用VARCHAR型字段時,你不需要為剪掉你數據中多余的空格而操心。

VARCHAR型字段的另?個突出的好處是它能夠比CHAR型字段占用更少的內存與硬盤空

問。當你的數據庫很大時,這種內存與磁盤空間的節(jié)約會變得非常重要。

文本型數據

字符型數據限制了字符串的長度不能超過255個字符。而使用文本型數據,你能夠存

放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。

這里有一-個使用文本型數據的例子:

CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydate

DATETIME)

在這個例子中,字段comments被用來存放訪問者對你站點的意見。注意文本型數據沒

有長度,而上一節(jié)中所講的字符型數據是有長度的。一個文本型字段中的數據通常要么為空,

要么很大。

當你從HTMLform的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息

存儲于文本型字段中。但是,不管何時,只要你能避免使用文本型字段,你就應該不適用它。

文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁

盤空間。

警告:

一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給

該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。

數值型數據

SQLSever支持許多種不一致的數值型數據。你能夠存儲整數、小數、與錢數。

通常,當你需要在表中的存放數字時,你要使用整型(INT)數據。INT型數據的表數

范圍是從-2,147,483,647到2,147,483,647的整數。下面是一個如何使用INT型數

據的例子:

CREATETABLEvisitlog(visitorVARCIIAR(40),nunvisitsINT)

這個表能夠用來記錄你站點被訪問的次數。只要沒有人訪問你的站點超過2,147,483,

647次,nubvisits字段就能夠存儲訪問次數。

為了節(jié)約內存空間,你能夠使用SMALLINT型數據。SMALLINT型數據能夠存儲從-32768

到32768的整數。這種數據類型的使用方法與INT型完全相同.

最后,假如你實在需要節(jié)約空間,你能夠使用TINYINT型數據。同樣,這種類型的使用

方法也與INT型相同,不一致的是這種類型的字段只能存儲從3到255的整數。TINYINT型

字段不能用來存儲負數。

通常,為了節(jié)約空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只占用

一個字節(jié);一個INT型數據占用四個字節(jié)。這看起來大概差別不大,但是在比較大的表中,

字節(jié)數的增長是很快的。另一方面,一旦你已經創(chuàng)建了一個字段,要修改它是很困難的。因

此,為安全起見,你應該預測下列,一個字段所需要存儲的數值最大有可能是多大,然后選

擇適當的數據類型。

為了能時字段所存放的數據有更多的操縱,你能夠使用NUVERIC型數據來同時表示?個

數的整數部分與小數部分。NUMERIC型數據使你能表示非常大的數一一比1NT型數據要大得

多。一個NUMERIC型字段能夠存儲從-10:退到10必范圍內的數。NUMERIC型數據還使你能表示

有小數部分的數。比如,你能夠在NUMERIC型字段中存儲小數3.14。

當定義一個NUMERIC型字段時,你需要同時指定整數部分的大小與小數部分的大小。這

里有一個使用這種數據類型的例子:

CREATETABLEnumeric_data(bignumberNUMERIC(28,0).

fractionNUMERIC(5,4))

當這個語句執(zhí)行時,將創(chuàng)建一個名為numeric_data的包含兩個字段的表。字段

bignumber能夠存儲直到28位的整數。字段fraction能夠存儲有五位整數部分與四位小數

部分的小數。

一個NUMERIC型數據的整數部分最大只能有28位,小數部分的位數務必小于或者等于

整數部分的位數,小數部分能夠是零。

你能夠使用INT型或者NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用

于此目的。假如你希望你的網點能掙很多錢,你能夠使用MONEY型數據。假如你的野心不大,

你能夠使用SMALLMONEY型數據。MONEY型數據能夠存儲從-922,337,203,685,477.5808

到922,337,203,685,477.5807的錢數。假如你需要存儲比這還大的金額,你能夠使用

NUMERIC型數據。

SMALLMONEY型數據只能存儲從-214,748.3648到214,748.3647的錢數。同樣,假如

能夠的話,你應該用SMALINONEY型來代替MONEY型數據,以節(jié)約空間。下面的例子顯示了

如何使用這兩種表示錢的數據類型:

CREATETABLEproducts(productVARC1LAR(40),priceMONEY,

Discount_priceSM?\I.I.MONE¥)

這個表能夠用來存儲商品的折扣與普通售價。字段price的數據類型是MONEY,字段

discountprice的數據類型是SM.1\LLM0NEYo

存儲邏輯值

假如你使用復選框(CHECKBOX)從網頁中搜集信息,你能夠把此信息存儲在BIT型字段

中。BIT型字段只能取兩個值:0或者1。這里有一個如何使用這種字段的例子:

CREATETABLEopinion(visitorVARCHAR(40),goodBIT)

這個表能夠用來存放對你的網點進行民意調查所得的信息?訪問者能夠投票表示他們是

否喜歡你的網點。假如他們投YES,就在BIT型字段中存入1。反之,假如他們投NO,就在

字段中存入0(在下一章里,你將學會如何計算投票)。

當心,在你創(chuàng)建好一個表之后,你不能向表中添加BIT型字段。假如你打算在一個表中

包含BIT型字段,你務必在創(chuàng)建表時完成。

存儲日期與時間

當你建立一個網點時,你也許需要記錄在一段時間內的訪問者數量。為了能夠存儲日期

與時間,你需要使用DATETIME型數據,如下例所示:

CREATETABLvisitorlcg(visitorVARCHAR(40),arnvaltimeDATETIME,

departuretimeDATETIME:

這個表能夠用來記錄訪問者進入與離開你網點的時間與日期。一個DATETIME型的字段

能夠存儲的日期范圍是從1753年1月1日第一亳秒到9999年12月31日最后一亳秒。

假如你不需要覆蓋這么大范圍的日期與時間,你能夠使用SMALLDATETTME型數據。它與

DATETIME型數據同樣使用,只只是它能表示的日期與時間范圍比DATETIME型數據小,而且

不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到

2079年6月6日的日期,它只能精確到秒。

DATETIME型字段在你輸入日期與時間之前并不包含實際的數據,認識這一點是重要的。

在下一章,你將學習如何使用大量的SQL函數來讀取與操作日期與時間(參見卜面的“缺省

值”一節(jié))。你也能夠在VBScript與JScript中使用日期與時間函數來向一個DATETIME型

字段中輸入日期與時間。

字段屬性

上一節(jié)介紹了如何建立包含不一致類型字段的表。在這一節(jié)中,你將學會如何使用字段

的三個屬性。這些屬性同意你操縱空值,缺省值與標識值。

同意與禁止空值

大多數字段能夠同意空值(NULL)。當一個字段同意了空值后,假如你不改變它,它將

一直保持空值??罩?NULL)與零是不一致的,嚴格的說,空值表示沒有任何值。

為了同意一個字段同意空值,你要在字段定義的后面使用表達式NULL。比如,下面的表中

兩個字段都同意同意空值:

CREATETABLEempty(empty1CHAR(40)NULL,empty2INTNULL(

注意:

BIT型數據不能是空值。一個這種類型的字段務必取0或者者1。

有的時候你需要禁止一個字段使用空值。比如,假設有一個表存儲著信用卡號碼與信用

卡有效日期,你不可能希望有人輸入一個信用卡號碼但不輸入有效日期。為了強制兩個字段

都輸入數據,你能夠用下面的方法建立這個表:

CREATETABLEcreditcards(creditcardnumberCH.AR(20)NOTNULL,

Creditcard_expireDATBTIMENOTNULL)

注意字段定義的后面跟有表達式NOTNULLo通過包含表達式NOTNULL,你能夠禁止任

何人只在一個字段中插入數據,而不輸入另一個字段的數據。

你將會發(fā)現,在你建設自己的網點過程中,這種禁止空值的能力是非常有用的。假如你

指定一個字段不能同意空值,那么當你試圖輸入一個空值時,會有錯誤警告。這些錯誤警告

能夠為程序調試提供有價值的線索。

缺省值

假設有一個存儲地址信息的表,這個表的字段包含街道、城市、州、郵政編碼與國家。

假如你估計地址的大部分是在美國,你能夠把這個值作為country字段的缺省值。

為了在創(chuàng)建一個表時指定缺省值,你能夠使用表達式DEFAJLT。請看卜.而這個在創(chuàng)建表

時使用缺省值的例子:

CREATETABLEaddresses(streetVARCHAR(60)NULL,

cityVARCHAR(40)NULL,

stateVARCI1AR(2O)NULL

zipVARCHAR(20)NULL,

countryVARCHAR(30)DEFAULT'USA')

在這個例子中,字段country的缺省值被指定為美國。注意單引號的使用,引號指明這

是字符型數據。為了給非字符型的字段指定缺省值,不要把該值擴在引號中:

CREATETABLEorders(priceMONEYDEFAULT$38.00,

quantityINTDEFAULT50,

entrydateDATETIMEDEFAULTGETDATEO)

在這個CREATETABLE語句中,每個字段都指定/一個缺省佰。注意DATETIME型字段

entrydate所指定的缺省值,該缺省值是函數GcldaleO的返回值,該函數返回當前的日期與

時間。

標識字段

每個表能夠有?個也只能有?個標識字段?!獋€標識字段是唯?標識表中每條記錄的特

殊字段。比如,數據庫pubs中的表jobs包含了一個唯一標識每個工作標識字段:

job_idjob_desc

1NewHireJobnotspecified

2ChiefExecutiveofficer

3BushnessOperationsManager

4ChiefFinancialOfficier

5Publisher

字段job_id為每個工作提供了唯一的一個數字。假如你決定增加一個新工作,新增記

錄的job_id字段會被自動賦給一個新的唯一值。

為了建立一個標識字段,你只需在字段定義后面加上表達式IDENTITY即可。你只能把

NUMERIC型或者INT型字段設為標識字段,這里有一個例子:

CREATETABLEvisitcrID(thelDNLBERIC(18)IDENTITY,nameVARCHAR(4O))

這個語句所創(chuàng)建的表包含一個名為theid的標識字段。每當一個新的訪問者名字添加到

這個表中時,這個字段就被自動賦給一個新值。你能夠用這個表為你的站點的每一個用戶提

供唯?標識。

技巧:

建立一個標示字段時,注意使用足夠大的數據類型。比如你使用TINYIXT型數據,那么

你只能向表中添加255個記錄。假如你估計一個表可能會變得很大,你應該使用NUMERIC

型數據。

標識字段的存在會使你想嘗試許多不可能的情況。比如,你也許想利用標識字段來對記

錄進行基于它們在表中位置的運算。你應該拋棄這種意圖。每個記錄的標識字段的值是互不

相同的,但是,這并不禁止一個標識字段的標識數字之間存在間隔。比如,你永遠不要試圖

利用一個表的標識字段來取出表中的前十個記錄。這種操作會導致失敗,比如說6號記錄與

7號記錄根本不存在。

使用SQL事務管理器創(chuàng)建新表

你能夠使用前面幾節(jié)所講的方法創(chuàng)建新表。但是,使用事務管理器創(chuàng)建新表會更容易。

這一節(jié)介紹如何使用這個程序創(chuàng)更新表。

從任務欄的SQLSever程序組中選擇SQLEnterpriseManager,啟動該程序,你會看

到如圖10.4所示的窗口。瀏覽服務管理器窗口中的樹形結構,選擇名為Database的文件夾。

打開文件夾Database后,選擇你在第三章中所建立的數據庫。

注意:

假如你還沒有創(chuàng)建自己的數據庫,回到第三章創(chuàng)建它。你決不要向master,lempdb或者

任何其它系統(tǒng)數據庫中添加數據。

在選擇了數據庫之后,你會看到一個名為Group/users的文件夾與一個名為objects

的文件夾。打開文件夾。bjects,你會看到許多文件夾,其中一個名為Tables。用右鍵單擊

文件夾Tables并選擇Newtable,就會出現如圖10.5所示的窗口。

你能夠使用ManagerTables窗口來創(chuàng)建一,個新表。ManagerTables窗口有7個列:

Key,Column,Name,Datatype,Size,Nulls與Default,ManagerTables窗口中的每一行標明

表中一個字段的信息。

圖10.4

10.5

要建立一個新表,你至少要輸入一行信息。在名為ColumnName的列下而鍵入

mycolumn。下一步,選擇Datatype列,并從下拉列表中選擇CHAR。當你在這兩個列中輸入

信息后,窗口將是如圖10.6所示的樣子。

圖10.6

你己經建立了一個只有一個字段的簡單的表。單擊儲存按扭儲存這個新表。當要求你榆

入新表的名字時,輸入mytable并單擊0K。現在這個表已經儲存到了你的數據庫中。

假如你打開服務管理器窗口中的文件夾Tables,你會看到你所建立的新表被列出。你能夠

雙擊該表的圖表來編輯它,這時ManagerTables窗口會重新出現,你能夠增加新的字段并

重新儲存。

用SQL事務管理器能夠做的工作,你都能夠用SQL語句來實現。但是,事務管理器使得

建表過程變得更加簡單。

向表中添加數據

下一章將討論如何使用SQL向一個表中插入數據。但是,假如你需要向一個表中添加許

多條記錄,使用SQL語句輸入數據是很不方便的。幸運的是,MicrosoftSQLSever帶有

一個稱之MicrosoftQuery的客戶端應用程序,這個程序使得句表中添加數據變得容易了。

啟動位于任務欄SQLSever程序組中的MicrosoftQuery程序。從窗口頂部的菜單中選

擇File|NewQuery,這時會顯示一個SelectDataSource對話框(見圖10.7)o選擇你的

數據源名字并單擊Use。

圖10。7

輸入你的登錄帳號與密碼后,程序要求你選擇一個表與一個數據庫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論