版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一、基礎(chǔ)1、說明:創(chuàng)建數(shù)據(jù)庫CreateDATABASEdatabase-name2、說明:刪除數(shù)據(jù)庫dropdatabasedbname3、說明:備份sqlserver創(chuàng)建備份數(shù)據(jù)的deviceUSEmasterEXECsp_addumpdevice'disk','testBack','c:\mssql7backup\MyNwind_1.dat'開始備份BACKUPDATABASEpubsTOtestBack4、說明:創(chuàng)建新表createtabletabname(col1type1[notnull][primarykey],col2type2[notnull],..)根據(jù)已有的表創(chuàng)建新表:A:createtabletab_newliketab_old(使用舊表創(chuàng)建新表)B:createtabletab_newasselectcol1,col2…fromtab_olddefinitiononly5、說明:刪除新表droptabletabname6、說明:增加一個列Altertabletabnameaddcolumncoltype注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。7、說明:添加主鍵:Altertabletabnameaddprimarykey(col)說明:刪除主鍵:Altertabletabnamedropprimarykey(col)8、說明:創(chuàng)建索引:create[unique]indexidxnameontabname(col….)刪除索引:dropindexidxname注:索引是不可更改的,想更改必須刪除重新建。9、說明:創(chuàng)建視圖:createviewviewnameasselectstatement刪除視圖:dropviewviewname10、說明:幾個簡單的基本的sql語句選擇:select*fromtable1where范圍插入:insertintotable1(field1,field2)values(value1,value2)刪除:deletefromtable1where范圍更新:updatetable1setfield1=value1where范圍查找:select*fromtable1wherefield1like’%value1%’like的語法很精妙,查資料!排序:select*fromtable1orderbyfield1,field2[desc]總數(shù):selectcountastotalcountfromtable1求和:selectsum(field1)assumvaluefromtable1平均:selectavg(field1)asavgvaluefromtable1最大:selectmax(field1)asmaxvaluefromtable1最小:selectmin(field1)asminvaluefromtable111、說明:幾個高級查詢運算詞A:UNION運算符UNION運算符通過組合其他兩個結(jié)果表(例如TABLE1和TABLE2)并消去表中任何重復(fù)行而派生出一個結(jié)果表。當ALL隨UNION一起使用時(即UNIONALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自TABLE1就是來自TABLE2。B:EXCEPT運算符EXCEPT運算符通過包括所有在TABLE1中但不在TABLE2中的行并消除所有重復(fù)行而派生出一個結(jié)果表。當ALL隨EXCEPT一起使用時(EXCEPTALL),不消除重復(fù)行。C:INTERSECT運算符INTERSECT運算符通過只包括TABLE1和TABLE2中都有的行并消除所有重復(fù)行而派生出一個結(jié)果表。當ALL隨INTERSECT一起使用時(INTERSECTALL),不消除重復(fù)行。注:使用運算詞的幾個查詢結(jié)果行必須是一致的。12、說明:使用外連接A、leftouterjoin:左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.cB:rightouterjoin:右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。C:fullouterjoin:全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。二、提升1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a新表名:b)(Access可用)法一:select*intobfromawhere1<>1法二:selecttop0*intobfroma2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a目標表名:b)(Access可用)insertintob(a,b,c)selectd,e,ffromb;3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對路徑)(Access可用)insertintob(a,b,c)selectd,e,ffrombin‘具體數(shù)據(jù)庫’where條件例子:..frombin'"&Server.MapPath("."&"\data.mdb"&"'where..4、說明:子查詢(表名1:a表名2:b)selecta,b,cfromawhereaIN(selectdfromb或者:selecta,b,cfromawhereaIN(1,2,3)5、說明:顯示文章、提交人和最后回復(fù)時間selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b6、說明:外連接查詢(表名1:a表名2:b)selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c7、說明:在線視圖查詢(表名1:aselect*from(Selecta,b,cFROMa)Twheret.a>1;8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時包括了邊界值,notbetween不包括select*fromtable1wheretimebetweentime1andtime2selecta,b,c,fromtable1whereanotbetween數(shù)值1and數(shù)值29、說明:in的使用方法select*fromtable1wherea[not]in(‘值1’,’值2’,’值4’,’值6’)10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息deletefromtable1wherenotexists(select*fromtable2wheretable1.field1=table2.field111、說明:四表聯(lián)查問題:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere12、說明:日程安排提前五分鐘提醒SQL:select*from日程安排wheredatediff('minute',f開始時間,getdate())>513、說明:一條sql語句搞定數(shù)據(jù)庫分頁selecttop10b.*from(selecttop20主鍵字段,排序字段from表名orderby排序字段desc)a,表名bwhereb.主鍵字段=a.主鍵字段orderbya.排序字段14、說明:前10條記錄selecttop10*formtable1where范圍15、說明:選擇在每一組b值相同的數(shù)據(jù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)selecta,b,cfromtablenametawherea=(selectmax(a)fromtablenametbwheretb.b=ta.b)16、說明:包括所有在TableA中但不在TableB和TableC中的行并消除所有重復(fù)行而派生出一個結(jié)果表(selectafromtableAexcept(selectafromtableB)except(selectafromtableC)17、說明:隨機取出10條數(shù)據(jù)selecttop10*fromtablenameorderbynewid()18、說明:隨機選擇記錄selectnewid()19、說明:刪除重復(fù)記錄Deletefromtablenamewhereidnotin(selectmax(id)fromtablenamegroupbycol1,col2,...)20、說明:列出數(shù)據(jù)庫里所有的表名selectnamefromsysobjectswheretype='U'21、說明:列出表里的所有的selectnamefromsyscolumnswhereid=object_id('TableName')22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現(xiàn)多重選擇,類似select中的case。selecttype,sum(casevenderwhen'A'thenpcselse0end),sum(casevenderwhen'C'thenpcselse0end),sum(casevenderwhen'B'thenpcselse0end)FROMtablenamegroupbytype顯示結(jié)果:typevenderpcs電腦A1電腦A1光盤B2光盤A2手機B3手機C323、說明:初始化表table1TRUNCATETABLEtable124、說明:選擇從10到15的記錄selecttop5*from(selecttop15*fromtableorderbyidasc)table_別名orderbyiddesc三、技巧1、1=1,1=2的使用,在SQL語句組合時用的較多“where1=1”是表示選擇全部“where1=2”全部不選,如:if@strWhere!='beginset@strSQL='selectcount(*)asTotalfrom['+@tblName+']where'+@strWhereendelsebeginset@strSQL='selectcount(*)asTotalfrom['+@tblName+']'end我們可以直接寫成set@strSQL='selectcount(*)asTotalfrom['+@tblName+']where1=1安定'+@strWhere2、收縮數(shù)據(jù)庫--重建索引DBCCREINDEXDBCCINDEXDEFRAG--收縮數(shù)據(jù)和日志DBCCSHRINKDBDBCCSHRINKFILE3、壓縮數(shù)據(jù)庫dbccshrinkdatabase(dbname)4、轉(zhuǎn)移數(shù)據(jù)庫給新用戶以已存在用戶權(quán)限execsp_change_users_login'update_one','newname','oldname'go5、檢查備份集RESTOREVERIFYONLYfromdisk='E:\dvbbs.bak'6、修復(fù)數(shù)據(jù)庫AlterDATABASE[dvbbs]SETSINGLE_USERGODBCCCHECKDB('dvbbs',repair_allow_data_loss)WITHTABLOCKGOAlterDATABASE[dvbbs]SETMULTI_USERGO7、日志清除SETNOCOUNTONDECLARE@LogicalFileNamesysname,@MaxMinutesINT,@NewSizeINTUSEtablename--要操作的數(shù)據(jù)庫名Select@LogicalFileName='tablename_log',--日志文件名@MaxMinutes=10,--Limitontimeallowedtowraplog.@NewSize=1--你想設(shè)定的日志文件的大小(M)--Setup/initializeDECLARE@OriginalSizeintSelect@OriginalSize=sizeFROMsysfilesWherename=@LogicalFileNameSelect'OriginalSizeof'+db_name()+'LOGis'+CONVERT(VARCHAR(30),@OriginalSize)+'8Kpagesor'+CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+'MB'FROMsysfilesWherename=@LogicalFileNameCreateTABLEDummyTrans(DummyColumnchar(8000)notnull)DECLARE@CounterINT,@StartTimeDATETIME,@TruncLogVARCHAR(255)Select@StartTime=GETDATE(),@TruncLog='BACKUPLOG'+db_name()+'WITHTRUNCATE_ONLY'DBCCSHRINKFILE(@LogicalFileName,@NewSize)EXEC(@TruncLog)--Wrapthelogifnecessary.WHILE@MaxMinutes>DATEDIFF(mi,@StartTime,GETDATE())--timehasnotexpiredAND@OriginalSize=(SelectsizeFROMsysfilesWherename=@LogicalFileName)AND(@OriginalSize*8/1024)>@NewSizeBEGIN--Outerloop.Select@Counter=0WHILE((@Counter<@OriginalSize/16)AND(@Counter<50000))BEGIN--updateInsertDummyTransVALUES('FillLog')DeleteDummyTransSelect@Counter=@Counter+1ENDEXEC(@TruncLog)ENDSelect'FinalSizeof'+db_name()+'LOGis'+CONVERT(VARCHAR(30),size)+'8Kpagesor'+CONVERT(VARCHAR(30),(size*8/1024))+'MB'FROMsysfilesWherename=@LogicalFileNameDropTABLEDummyTransSETNOCOUNTOFF8、說明:更改某個表execsp_changeobjectowner'tablename','dbo'9、存儲更改全部表CreatePROCEDUREdbo.User_ChangeObjectOwnerBatch@OldOwnerasNVARCHAR(128),@NewOwnerasNVARCHAR(128)ASDECLARE@NameasNVARCHAR(128)DECLARE@OwnerasNVARCHAR(128)DECLARE@OwnerNameasNVARCHAR(128)DECLAREcurObjectCURSORFORselect'Name'=name,'Owner'=user_name(uid)fromsysobjectswhereuser_name(uid)=@OldOwnerorderbynameOPENcurObjectFETCHNEXTFROMcurObjectINTO@Name,@OwnerWHILE(@@FETCH_STATUS=0)BEGINif@Owner=@OldOwnerbeginset@OwnerName=@OldOwner+'.'+rtrim(@Name)execsp_changeobjectowner@OwnerName,@NewOwnerend--select@name,@NewOwner,@OldOwnerFETCHNEXTFROMcurObjectINTO@Name,@OwnerENDclosecurObjectdeallocatecurObjectGO10、SQLSERVER中直接循環(huán)寫入數(shù)據(jù)declare@iintset@i=1while@i<30begininsertintotest(userid)values(@i)set@i=@i+1end第三部分操作數(shù)據(jù):SQL本部分內(nèi)容SQL基礎(chǔ)中級SQL高級SQL
第10章SQL基礎(chǔ)本章內(nèi)容SQL介紹使用SELECT語句從表中取數(shù)據(jù)創(chuàng)建新表字段屬性向表中添加數(shù)據(jù)刪除和修改表
為了建立交互站點,你需要使用數(shù)據(jù)庫來存儲來自訪問者的信息。例如,你要建立一個職業(yè)介紹服務(wù)的站點,你就需要存儲諸如個人簡歷,所感興趣的工作等等這樣的信息。創(chuàng)建動態(tài)網(wǎng)葉也需要使用數(shù)據(jù)庫,如果你想顯示符合來訪者要求的最好的工作,你就需要從數(shù)據(jù)庫中取出這份工作的信息。你將會發(fā)現(xiàn),在許多情況下需要使用數(shù)據(jù)庫。在這一章里,你將學會怎樣使用“結(jié)構(gòu)化查詢語言”(SQL〕來操作數(shù)據(jù)庫。SQL語言是數(shù)據(jù)庫的標準語言。在ActiveSeverPages中,無論何時你要訪問一個數(shù)據(jù)庫,你就要使用SQL語言。因此,掌握好SQL對ASP編程是非常重要的。注意:你可以把“SQL”讀作“sequel”,也可以按單個字母的讀音讀作S-Q-L。兩種發(fā)音都是正確的,每種發(fā)音各有大量的支持者。在本書里,認為“SQL”讀作“sequel”。通過這一章的學習,你將理解怎樣用SQL實現(xiàn)數(shù)據(jù)庫查詢,你將學會怎樣使用這種查詢從數(shù)據(jù)表中取出信息,最后,你將學會怎樣設(shè)計和建立自己的數(shù)據(jù)庫。注意:通過下面幾章對SQL的介紹,你將對SQL有足夠的了解,從而可以有效地使用ActiveSeverPages。但是,SQL是一種復(fù)雜的語言,本書不可能包括它的全部細節(jié)。要全面掌握SQL語言,你需要學習在MicrosoftSQLSever中使用SQL。你可以到附近的書店去買一本MicrosoftSQLSever6.5。SQL介紹:本書假設(shè)你是在SQL操作MicrosoftSQLSever的數(shù)據(jù)庫。你也可以用SQL操作許多其它類型的數(shù)據(jù)庫。SQL是操作數(shù)據(jù)庫的標準語言。(事實上,關(guān)于SQL語言有一個專門的ANSI標準〕注意:不要在你的站點上試圖用MicrosoftAccess代替MicrosoftSQLSever。SQLSever可以同時服務(wù)于許多用戶,如果你希望你的站點有較高的訪問率,MSAccess是不能勝任的。在學習SQL的細節(jié)之前,你需要理解它的兩大特點。一個特點容易掌握,另一個掌握起來有點困難。第一個特點是所有SQL數(shù)據(jù)庫中的數(shù)據(jù)都存儲在表中。一個表由行和列組成。例如,下面這個簡單的表包括name和e-mailaddress:NameEmailAddresspresidentClinton這個表有兩列(列也稱為字段,域〕:Name和EmailAddress。有三行,每一行包含一組數(shù)據(jù)。一行中的數(shù)據(jù)組合在一起稱為一條記錄。無論何時你向表中添加新數(shù)據(jù),你就添加了一條新記錄。一個數(shù)據(jù)表可以有幾十個記錄,也可以有幾千甚至幾十億個記錄。雖然你也許永遠不需要存儲十億個Email地址,但知道你能這樣做總是好的,也許有一天你會有這樣的需要。你的數(shù)據(jù)庫很有可能包含幾十個表,所有存儲在你數(shù)據(jù)庫中的信息都被存儲在這些表中。當你考慮怎樣把信息存儲在數(shù)據(jù)庫中時,你應(yīng)該考慮怎樣把它們存儲在表中。SQL的第二個特點有些難于掌握。這種語言被設(shè)計為不允許你按照某種特定的順序來取出記錄,因為這樣做會降低SQLSever取記錄的效率。使用SQL,你只能按查詢條件來讀取記錄。當考慮如何從表中取出記錄時,自然會想到按記錄的位置讀取它們。例如,也許你會嘗試通過一個循環(huán),逐個記錄地掃描,來選出特定的記錄。在使用SQL時,你必須訓練自己,不要有這種思路。假如你想選出所有的名字是“BillGates”的記錄,如果使用傳統(tǒng)的編程語言,你也許會構(gòu)造一個循環(huán),逐個查看表中的記錄,看名字域是否是“BillGates”。這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說,“選擇所有名字域等于BillGates的記錄”,SQL就會為你選出所有符合條件的記錄。SQL會確定實現(xiàn)查詢的最佳方法。建設(shè)你想取出表中的前十個記錄。使用傳統(tǒng)的編程語言,你可以做一個循環(huán),取出前十個記錄后結(jié)束循環(huán)。但使用標準的SQL查詢,這是不可能實現(xiàn)的。從SQL的角度來說,在一個表中不存在前十個記錄這種概念。開始時,當你知道你不能用SQL實現(xiàn)某些你感覺應(yīng)該能實現(xiàn)的功能,你會受到挫折。你也許會以頭撞墻甚至想寫惡毒的信件給SQL的設(shè)計者們。但后來你會認識到,SQL的這個特點不僅不是個限制,反而是其長處。因為SQL不根據(jù)位置來讀取記錄,它讀取記錄可以很快。綜上所述,SQL有兩個特點:所有數(shù)據(jù)存儲在表中,從SQL的角度來說,表中的記錄沒有順序。在下一節(jié),你將學會怎樣用SQL從表中選擇特殊的記錄。使用SQL從表中取記錄。SQL的主要功能之一是實現(xiàn)數(shù)據(jù)庫查詢。如果你熟悉Internet引擎,那么你已經(jīng)熟悉查詢了。你使用查詢來取得滿足特定條件的信息。例如,如果你想找到有ASP信息的全部站點,你可以連接到Y(jié)ahoo!并執(zhí)行一個對ActiveSeverPages的搜索。在你輸入這個查詢后,你會收到一個列表,表中包括所有其描述中包含搜索表達式的站點。多數(shù)Internet引擎允許邏輯查詢。在邏輯查詢中,你可以包括特殊的運算符如AND、OR和NOT,你使用這些運算符來選擇特定的記錄。例如,你可以用AND來限制查詢結(jié)果。如果你執(zhí)行一個對ActiveSeverPagesANDSQL的搜索。你將得到其描述中同時包含ActiveSeverPages和SQL的記錄。當你需要限制查詢結(jié)果時,你可以使用AND。如果你需要擴展查詢的結(jié)果,你可以使用邏輯操作符OR。例如,如果你執(zhí)行一個搜索,搜索所有的其描述中包含ActiveSeverPagesORSQL的站點,你收到的列表中將包括所有其描述中同時包含兩個表達式或其中任何一個表達式的站點。如果你想從搜索結(jié)果中排除特定的站點,你可以使用NOT。例如,查詢“ActiveSeverPages”ANDNOT“SQL”將返回一個列表,列表中的站點包含ActiveSeverPages,但不包含SQL。當必須排除特定的記錄時,你可以使用NOT。用SQL執(zhí)行的查詢與用Internet搜索引擎執(zhí)行的搜索非常相似。當你執(zhí)行一個SQL查詢時,通過使用包括邏輯運算符的查詢條件,你可以得到一個記錄列表。此時查詢結(jié)果是來自一個或多個表。SQL查詢的句法非常簡單。假設(shè)有一個名為email_table的表,包含名字和地址兩個字段,要得到BillGates的e_mail地址,你可以使用下面的查詢:SELECTemailfromemail_tableWHEREname="BillGates"當這個查詢執(zhí)行時,就從名為email_table的表中讀取BillGates的e_mail地址。這個簡單的語句包括三部分:■SELECT語句的第一部分指名要選取的列。在此例中,只有email列被選取。當執(zhí)行時,只顯示email列的值billg@?!鯯ELECTT語句的第二部份指明要從哪個(些)表中查詢數(shù)據(jù)。在此例中,要查詢的表名為email_table?!鲎詈螅琒ELECT語句的WHERE子句指明要選擇滿足什么條件的記錄。在此例中,查詢條件為只有name列的值為BillGates的記錄才被選取。BillGates很有可能擁有不止一個email地址。如果表中包含BillGates的多個email地址。用上述的SELECT語句可以讀取他所有的email地址。SELECT語句從表中取出所有name字段值為BillGates的記錄的email字段的值。前面說過,查詢可以在查詢條件中包含邏輯運算符。假如你想讀取BillGates或Clinton總統(tǒng)的所有email地址,你可以使用下面的查詢語句:SELECTemailFROMemail_tableWHEREname="BillGates"ORname="presidentClinton"此例中的查詢條件比前一個復(fù)雜了一點。這個語句從表email_table中選出所有name列為BillGates或presidentClinton的記錄。如果表中含有BillGates或presidentClinton的多個地址,所有的地址都被讀取。SELECT語句的結(jié)構(gòu)看起來很直觀。如果你請一個朋友從一個表中為你選擇一組記錄,你也許以非常相似的方式提出你的要求。在SQLSELECT語句中,你“SELECT特定的列FROM一個表WHERE某些列滿足一個特定的條件”。下一節(jié)將介紹怎樣執(zhí)行SQL查詢來選取記錄。這將幫助你熟悉用SELECT語句從表中取數(shù)據(jù)的各種不同方法。使用ISQL執(zhí)行SELECT查詢當你安裝SQLSever時,你同時安裝了一個叫作ISQL/w的應(yīng)用程序。ISQL/w允許你執(zhí)行交互的SQL查詢。在把查詢包括到你的ASP網(wǎng)頁中之前,用ISQL/w對其進行測試是非常有用的。注意:在這本書的第一部份,你學習了怎樣安裝和配置MicrosoftSQLSever。如果沒有安裝SQLSever或者SQLSever不能運行,請參閱第三章“安裝和使用SQLSever”。選擇任務(wù)上SQLSever程序組中的ISQL_w以啟動該程序。程序啟動時,首先會出現(xiàn)一個對話框,要求輸入服務(wù)器信息和登錄信息(見圖10.1)。在Sever框中,輸入你的SQL服務(wù)器的名字。如果服務(wù)器正運行在本地計算機上,服務(wù)器名字就是你計算機的名字。在登錄信息框中,輸入一個登錄帳號和密碼或選擇使用“可信連接”,然后單擊Connect按鈕。圖10。1注意:如果你將SQLSever配置為使用完整安全或混合安全,那么你可以使用可信連接。如果你使用標準安全,你則需要提供用戶帳號和密碼。要了解更多信息,參見第三章。如果一切正常,在你單擊連接按鈕后會出現(xiàn)一個查詢窗口,如圖10.2所示。(如果有異常,請參考第三章)圖10.2在執(zhí)行查詢之前,你需要選擇數(shù)據(jù)庫。安裝SQLSever時你已為自己創(chuàng)建了一個數(shù)據(jù)庫,SQLSever還有許多系統(tǒng)數(shù)據(jù)庫,如master,model,msdb,和tempdb。方便的是,SQLSever帶有一個特殊的名為pubs的例子數(shù)據(jù)庫。庫pubs中包含供一個虛擬的出版商使用的各個表。文檔中所有的例子程序都是針對這個庫來設(shè)計的。本書中的許多例子也使用這個數(shù)據(jù)庫。在查詢窗口頂部的DB下拉框中選擇數(shù)據(jù)庫pubs,這樣你就選擇了數(shù)據(jù)庫。你所有的查詢都將針對這個庫中的各個表來執(zhí)行?,F(xiàn)在你可以執(zhí)行你的第一個查詢了。這真讓人興奮!你的第一個查詢將針對一個名為autrors的表,表中包含所有為某個虛擬出版商工作的作者的相關(guān)數(shù)據(jù)。單擊查詢窗口并輸入以下的語句:SELECTphoneFROMauthorsWHEREau_name="Ringer"輸入完成后,單擊執(zhí)行查詢按鈕(一個綠色三角形,看起來像VCR播放鍵)。單擊此按鈕后,任何出現(xiàn)在查詢窗口中的語句均會被執(zhí)行。查詢窗口會自動變成結(jié)果顯示窗口,你可以看到查詢的結(jié)果(見圖10.3)。你看到的查詢結(jié)果也許與圖10.3所示的不同。在SQLSever的不同版本中,庫pubs中的數(shù)據(jù)會有所不同。對SQLSever6.5來說,將會找到兩條記錄。結(jié)果顯示窗口中應(yīng)顯示如下內(nèi)容:phone……………….801826_0752801826_0752(2row(s)affected)圖10.3你所執(zhí)行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號碼。你通過在WHERE子句中使用特殊的選擇條件來限制查詢的結(jié)果。你也可以忽略選擇條件,從表中取出所有作者的電話號碼。要做到這一點,單擊Query標簽,返回到查詢窗口,輸入以下的SELECT語句:SELECTPhoneFROMauthors這個查詢執(zhí)行后,會取出表authors中的所有電話號碼(沒有特定的順序)。如果表authors中包含一百個電話號碼,會有一百個記錄被取出,如果表中有十億個電話號碼,這十億條記錄都會被取出(這也許需要一些時間)。表authrs的字段包括姓,名字,電話號碼,地址,城市,州和郵政編碼。通過在SELECT語句的第一部份指定它們,你可以從表中取出任何一個字段。你可以在一個SELECT語句中一次取出多個字段,比如:SELECTau_fname,au_lname,phoneFROMauthors這個SELECT語句執(zhí)行后,將取出這三個列的所有值。下面是這個查詢的結(jié)果的一個示例(為了節(jié)省紙張,只顯示查詢結(jié)果的一部分,其余記錄用省略號代替):au_fnameau_lnamephone………….JohnsonWhite408496_7223MarjorieGreen415986_7020CherylCarson415548_7723MichaelO’Leary408286_2428…(23row(s)affected)在SELECT語句中,你需要列出多少個字段,你就可以列出多少。不要忘了把字段名用逗號隔開。你也可以用星號(*)從一個表中取出所有的字段。這里有一個使用星號的例子:SELECT*FROMauthors這個SELECT語句執(zhí)行后,表中的所有字段的值都被取出。你會發(fā)現(xiàn)你將在SQL查詢中頻繁使用星號。技巧:你可以使用星號來查看一個表的所有列的名字。要做到這一點,只需要在執(zhí)行完SELECT語句后看一下查詢結(jié)果的列標題。操作多個表到現(xiàn)在為止,你只嘗試了用一句SQL查詢從一個表中取出數(shù)據(jù)。你也可以用一個SELECT語句同時從多個表中取出數(shù)據(jù),只需在SELECT語句的FROM從句中列出要從中取出數(shù)據(jù)的表名稱即可:SELECTau_lname,titleFROMauthors,titles這個SELECT語句執(zhí)行時,同時從表authors和表titles中取出數(shù)據(jù)。從表authors中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執(zhí)行這個查詢,看一下查詢結(jié)果。你會發(fā)現(xiàn)一些奇怪的出乎意料的情況:作者的名字并沒有和它們所著的書相匹配,而是出現(xiàn)了作者名字和書名的所有可能的組合,這也許不是你所希望見到的。出了什么差錯?問題在于你沒有指明這兩個表之間的關(guān)系。你沒有通過任何方式告訴SQL如何把表和表關(guān)聯(lián)在一起。由于不知道如何關(guān)聯(lián)兩個表,服務(wù)器只能簡單地返回取自兩個表中的記錄的所有可能組合。要從兩個表中選出有意義的記錄組合,你需要通過建立兩表中字段的關(guān)系來關(guān)聯(lián)兩個表。要做到這一點的途徑之一是創(chuàng)建第三個表,專門用來描述另外兩個表的字段之間的關(guān)系。表authors有一個名為au_id的字段,包含有每個作者的唯一標識。表titles有一個名為title_id的字段,包含每個書名的唯一標識。如果你能在字段au_id和字段title_id之間建立一個關(guān)系,你就可以關(guān)聯(lián)這兩個表。數(shù)據(jù)庫pubs中有一個名為titleauthor的表,正是用來完成這個工作。表中的每個記錄包括兩個字段,用來把表titles和表authors關(guān)聯(lián)在一起。下面的SELECT語句使用了這三個表以得到正確的結(jié)果:SELECTau_name,titleFROMauthors,titles,titleauthorWHEREauthors.au_id=titleauthor.au_idANDtitles.title_id=titleauthor.title_id當這個SELECT語句執(zhí)行時,每個作者都將與正確的書名相匹配。表titleauthor指明了表authors和表titles的關(guān)系,它通過包含分別來自兩個表的各一個字段實現(xiàn)這一點。第三個表的唯一目的是在另外兩個表的字段之間建立關(guān)系。它本身不包含任何附加數(shù)據(jù)。注意在這個例子中字段名是如何書寫的。為了區(qū)別表authors和表titles中相同的字段名au_id,每個字段名前面都加上了表名前綴和一個句號。名為author.au_id的字段屬于表authors,名為titleauthor.au_id的字段屬于表titleauthor,兩者不會混淆。通過使用第三個表,你可以在兩個表的字段之間建立各種類型的關(guān)系。例如,一個作者也許寫了許多不同的書,或者一本書也許由許多不同的作者共同完成。當兩個表的字段之間有這種“多對多”的關(guān)系時,你需要使用第三個表來指明這種關(guān)系。但是,在許多情況下,兩個表之間的關(guān)系并不復(fù)雜。比如你需要指明表titles和表publishers之間的關(guān)系。因為一個書名不可能與多個出版商相匹配,你不需要通過第三個表來指明這兩個表之間的關(guān)系。要指明表titles和表publishers之間的關(guān)系,你只要讓這兩個表有一個公共的字段就可以了。在數(shù)據(jù)庫pubs中,表titles和表publishers都有一個名為pub_id的字段。如果你想得到書名及其出版商的一個列表,你可以使用如下的語句:SELECTtitle,pub_nameFROMtitles,publishers WHEREtitles.pub_id=publishers.pub_id當然,如果一本書是由兩個出版商聯(lián)合出版的,那么你需要第三個表來代表這種關(guān)系。通常,當你予先知道兩個表的字段間存在“多對多”關(guān)系時,就使用第三個表來關(guān)聯(lián)這兩個表。反之,如果兩個表的字段間只有“一對一”或“一對多”關(guān)系,你可以使用公共字段來關(guān)聯(lián)它門。操作字段通常,當你從一個表中取出字段值時,該值與創(chuàng)建該表時所定義的字段名聯(lián)系在一起。如果你從表authors中選擇所有的作者名字,所有的值將會與字段名au_lname相聯(lián)系。但是在某些情況下,你需要對字段名進行操作。在SELECT語句中,你可以在缺省字段名后面僅跟一個新名字來取代它。例如,可以用一個更直觀易讀的名字AuthorLastName來代替字段名au_lname:SELECTau_lname"AuthorLastName"FROMauthors當這個SELECT語句執(zhí)行時,來自字段au_lname的值會與“AuthorLastName”相聯(lián)系。查詢結(jié)果可能是這樣:AuthorLastName……………………..WhiteGreenCarsonO’LearyStraight…(23row(s)affected)注意字段標題不再是au_lname,而是被AuthorLastName所取代。你也可以通過執(zhí)行運算,來操作從一個表返回的字段值。例如,如果你想把表titles中的所有書的價格加倍,你可以使用下面的SELECT語句:SELECTprice*2FROMtitles當這個查詢執(zhí)行時,每本書的價格從表中取出時都會加倍。但是,通過這種途徑操作字段不會改變存儲在表中的書價。對字段的運算只會影響SELECT語句的輸出,而不會影響表中的數(shù)據(jù)。為了同時顯示書的原始價格和漲價后的新價格,你可以使用下面的查詢:SELECTprice"Originalprice",price*2"Newprice"FROMtitles當數(shù)據(jù)從表titles中取出時,原始價格顯示在標題Originalprice下面,加倍后的價格顯示在標題Newprice下面。結(jié)果可能是這樣:originalpricenewprice……………….39.9811.9523.905.9839.98…(18row(s)affected)你可以使用大多數(shù)標準的數(shù)學運算符來操作字段值,如加(+),減(-),乘(*)和除(/)。你也可以一次對多個字段進行運算,例如:SELECTprice*ytd_sales"totalrevenue"FROMtitles在這個例子中,通過把價格與銷售量相乘,計算出了每種書的總銷售額。這個SELECT語句的結(jié)果將是這樣的:totalrevenue……………..81,859,0546,318,2055,978,7881,859,0540,619,68…(18row(s)affected)最后,你還可以使用連接運算符(它看起來像個加號)來連接兩個字符型字段:SELECTau_fname+""+au_lname"authorname"FROMauthors在這個例子中,你把字段au_fname和字段au_lname粘貼在一起,中間用一個逗號隔開,并把查詢結(jié)果的標題指定為authorname。這個語句的執(zhí)行結(jié)果將是這樣的:authornames…………JohnsonWhiteMarjorieGreenCherylCarsonMichaelO’LearyDeanStraight…(23row(s)affected)可以看到,SQL為你提供了對查詢結(jié)果的許多控制。你應(yīng)該在ASP編程過程中充分利用這些優(yōu)點。使用SQL來操作查詢結(jié)果幾乎總是比使用有同樣作用的腳本效率更高。排序查詢結(jié)果本章的介紹中曾強調(diào)過,SQL表沒有內(nèi)在的順序。例如,從一個表中取第二個記錄是沒有意義的。從SQL的角度看來,沒有一個記錄在任何其他記錄之前。然而,你可以操縱一個SQL查詢結(jié)果的順序。在缺省情況下,當記錄從表中取出時,記錄不以特定的順序出現(xiàn)。例如,當從表authors中取出字段au_lname時,查詢結(jié)果顯示成這樣:au_lname…….WhiteGreenCarsonO’LearyStraight…(23row(s)affected)看一列沒有特定順序的名字是很不方便的。如果把這些名字按字母順序排列,讀起來就會容易得多。通過使用ORDERBY子句,你可以強制一個查詢結(jié)果按升序排列,就像這樣:SELECTau_lnameFROMauthorsORDERBYau_lname當這個SELECT語句執(zhí)行時,作者名字的顯示將按字母順序排列。ORDERBY子句將作者名字按升序排列。你也可以同時對多個列使用ORDERBY子句。例如,如果你想同時按升序顯示字段au_lname和字段au_fname,你需要對兩個字段都進行排序:SELECTau_lname,au_fnameFROMauthorsORDERBYau_lname,au_fname這個查詢首先把結(jié)果按au_lname字段進行排序,然后按字段au_fname排序。記錄將按如下的順序取出:au_lnameau_fname…………………….BennetAbrahamRingerAlbertRingerAnneSmithMeander…(23row(s)affected)注意有兩個作者有相同的名字Ringer。名為AlbertRinger的作者出現(xiàn)名為AnneRinger的作者之前,這是因為姓Albert按字母順序應(yīng)排在姓Anne之前。如果你想把查詢結(jié)果按相反的順序排列,你可以使用關(guān)鍵字DESC。關(guān)鍵字DESC把查詢結(jié)果按降序排列,如下例所示:SELECTau_lname,au_fnameFROMauthorsWHEREau_lname=”Ringer”O(jiān)RDERBYau_lname,au_fnameDESC這個查詢從表authors中取出所有名字為Ringer的作者記錄。ORDERBY子句根據(jù)作者的名字和姓,將查詢結(jié)果按降序排列。結(jié)果是這樣的:au_lnameau_fname……………………….RingerAnneRingerAlbert(2row(s)affectec)注意在這個表中,姓Anne出現(xiàn)在姓Albert之前。作者名字按降序顯示。你也可以按數(shù)值型字段對一個查詢結(jié)果進行排序。例如,如果你想按降序取出所有書的價格,你可以使用如下的SQL查詢:SELECTpriceFROMtitlesORDERBYpriceDESC這個SELECT語句從表中取出所有書的價格,顯示結(jié)果時,價格低的書先顯示,價格高的書后顯示。警告:不是特別需要時,不要對查詢結(jié)果進行排序,因為服務(wù)器完成這項工作要費些力氣。這意味著帶有ORDERBY子句的SELECT語句執(zhí)行起來比一般的SELECT語句花的時間長。取出互不相同的記錄一個表有可能在同一列中有重復(fù)的值。例如,數(shù)據(jù)庫pubs的表authors中有兩個作者的名字是Ringer。如果你從這個表中取出所有的名字,名字Ringer將會顯示兩次。在特定情況下,你可能只有興趣從一個表中取出互不相同的值。如果一個字段有重復(fù)的值,你也許希望每個值只被選取一次,你可以使用關(guān)鍵字DISTINCT來做到這一點:SELCETDISTINCTau_lnameFROMauthorsWHEREau_lname="Ringer"當這個SELECT語句執(zhí)行時,只返回一個記錄。通過在SELECT語句中包含關(guān)鍵字DISTINCT,你可以刪除所有重復(fù)的值。例如,假設(shè)有一個關(guān)于新聞組信息發(fā)布的表,你想取出所有曾在這個新聞組中發(fā)布信息的人的名字,那么你可以使用關(guān)鍵字DISTINCT。每個用戶的名字只取一次——盡管有的用戶發(fā)布了不止一篇信息。警告:如同ORDERBY子句一樣,強制服務(wù)器返回互不相同的值也會增加運行開銷。福氣不得不花費一些時間來完成這項工作。因此,不是必須的時候不要使用關(guān)鍵字DISTINCT。創(chuàng)建新表前面說過,數(shù)據(jù)庫中的所有數(shù)據(jù)存儲在表中。數(shù)據(jù)表包括行和列。列決定了表中數(shù)據(jù)的類型。行包含了實際的數(shù)據(jù)。例如,數(shù)據(jù)庫pubs中的表authors有九個字段。其中的一個字段名為為au_lname,這個字段被用來存儲作者的名字信息。每次向這個表中添加新作者時,作者名字就被添加到這個字段,產(chǎn)生一條新記錄。通過定義字段,你可以創(chuàng)建一個新表。每個字段有一個名字和一個特定的數(shù)據(jù)類型(數(shù)據(jù)類型在后面的“字段類型”一節(jié)中講述),例如字段au_lname存儲的是字符型數(shù)據(jù)。一個字段也可以存儲其它類型的數(shù)據(jù)。使用SQLSever,創(chuàng)建一個新表的方法是很多的。你可以可執(zhí)行一個SQL語句或使用SQL事務(wù)管理器(SQLEnterpriseManager)來創(chuàng)建一個新表。在下一節(jié)里,你將學會如何用SQL語句來創(chuàng)建一個新表。用SQL創(chuàng)建新表注意:如果你還沒有建立自己的數(shù)據(jù)庫,現(xiàn)在就跳回到第三章創(chuàng)建這個庫。你絕不能向master,tempdb或任何其他任何系統(tǒng)數(shù)據(jù)庫中添加數(shù)據(jù)。從SQLSever程序組(在任務(wù)欄中)中啟動ISQL/w程序。出現(xiàn)查詢窗口后,從窗口頂部的下拉列表中選擇你在第三章所創(chuàng)建的數(shù)據(jù)庫。下一步,在查詢窗口中鍵入下面的SQL語句,單擊執(zhí)行查詢按鈕,執(zhí)行這個語句:CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydateDATETIME)如果一切正常,你會在結(jié)果窗口中看到如下的文字(如果出現(xiàn)異常,請參閱第三章):Thiscommandditnotreturndata,anditdidnotreturnanyrows祝賀你,你已經(jīng)建立了你的第一個表!你所創(chuàng)建的表名為guestbook,你可以使用這個表來存儲來字你站點訪問者的信息。你是用REEATETABLE語句創(chuàng)建的這個表,這個語句有兩部分:第一部份指定表的名子;第二部份是括在括號中的各字段的名稱和屬性,相互之間用逗號隔開。表guestbook有三個字段:visitor,comments和entrydate。visitor字段存儲訪問者的名字,comments字段存儲訪問者對你站點的意見,entrydate字段存儲訪問者訪問你站點的日期和時間。注意每個字段名后面都跟有一個專門的表達式。例如,字段名comments后面跟有表達式TEXT。這個表達式指定了字段的數(shù)據(jù)類型。數(shù)據(jù)類型決定了一個字段可以存儲什么樣的數(shù)據(jù)。因為字段comments包含文本信息,其數(shù)據(jù)類型定義為文本型。字段有許多不同的數(shù)據(jù)類型。下一小節(jié)講述SQL所支持的一些重要的數(shù)據(jù)類型。字段類型不同的字段類型用來存放不同類型的數(shù)據(jù)。創(chuàng)建和使用表時,更你應(yīng)該理解五種常用的字段類型:字符型,文本型,數(shù)值型,邏輯性和日期型。字符型數(shù)據(jù)字符型數(shù)據(jù)非常有用。當你需要存儲短的字符串信息時,你總是要用到字符型數(shù)據(jù)。例如,你可以把從HTMLform的文本框中搜集到的信息放在字符型字段中。要建立一個字段用來存放可變長度的字符串信息,你可以使用表達式VARCHAR??紤]你前面創(chuàng)建的表guestbook:CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydateDATETIME)在這個例子中,字段visitor的數(shù)據(jù)類型為VARCHAR。注意跟在數(shù)據(jù)類型后面的括號中的數(shù)字。這個數(shù)字指定了這個字段所允許存放的字符串的最大長度。在這個例子中,字段visitor能存放的字符串最長為四十個字符。如果名字太長,字符串會被截斷,只保留四十個字符。VARCHAR類型可以存儲的字符串最長為255個字符。要存儲更長的字符串數(shù)據(jù),可以使用文本型數(shù)據(jù)(下一節(jié)中講述)。另一種字符型數(shù)據(jù)用來存儲固定長度的字符數(shù)據(jù)。下面是一個使用這種數(shù)據(jù)類型的例子:CREATETABLEguestbook(visitorCHAR(40),commentsTEXT,entrydateDATETIME)在這個例子中,字段visitor被用來存儲四十個字符的固定長度字符串。表達式CHAR指定了這個字段應(yīng)該是固定長度的字符串。VARCHAR型和CHAR型數(shù)據(jù)的這個差別是細微的,但是非常重要。假如你向一個長度為四十個字符的VARCHAR型字段中輸入數(shù)據(jù)BillGates。當你以后從這個字段中取出此數(shù)據(jù)時,你取出的數(shù)據(jù)其長度為十個字符——字符串BillGates的長度?,F(xiàn)在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那么當你取出數(shù)據(jù)時,所取出的數(shù)據(jù)長度將是四十個字符。字符串的后面會被附加多余的空格。當你建立自己的站點時,你會發(fā)現(xiàn)使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數(shù)據(jù)中多余的空格而操心。VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內(nèi)存和硬盤空間。當你的數(shù)據(jù)庫很大時,這種內(nèi)存和磁盤空間的節(jié)省會變得非常重要。文本型數(shù)據(jù)字符型數(shù)據(jù)限制了字符串的長度不能超過255個字符。而使用文本型數(shù)據(jù),你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應(yīng)該使用文本型數(shù)據(jù)。這里有一個使用文本型數(shù)據(jù)的例子:CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydateDATETIME)在這個例子中,字段comments被用來存放訪問者對你站點的意見。注意文本型數(shù)據(jù)沒有長度,而上一節(jié)中所講的字符型數(shù)據(jù)是有長度的。一個文本型字段中的數(shù)據(jù)通常要么為空,要么很大。當你從HTMLform的多行文本編輯框(TEXTAREA)中收集數(shù)據(jù)時,你應(yīng)該把收集的信息存儲于文本型字段中。但是,無論何時,只要你能避免使用文本型字段,你就應(yīng)該不適用它。文本型字段既大且慢,濫用文本型字段會使服務(wù)器速度變慢。文本型字段還會吃掉大量的磁盤空間。警告:一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),就會有2K的空間被自動分配給該數(shù)據(jù)。除非刪除該記錄,否則你無法收回這部分存儲空間。數(shù)值型數(shù)據(jù)SQLSever支持許多種不同的數(shù)值型數(shù)據(jù)。你可以存儲整數(shù)、小數(shù)、和錢數(shù)。通常,當你需要在表中的存放數(shù)字時,你要使用整型(INT)數(shù)據(jù)。INT型數(shù)據(jù)的表數(shù)范圍是從-2,147,483,647到2,147,483,647的整數(shù)。下面是一個如何使用INT型數(shù)據(jù)的例子:CREATETABLEvisitlog(visitorVARCHAR(40),numvisitsINT)這個表可以用來記錄你站點被訪問的次數(shù)。只要沒有人訪問你的站點超過2,147,483,647次,nubvisits字段就可以存儲訪問次數(shù)。為了節(jié)省內(nèi)存空間,你可以使用SMALLINT型數(shù)據(jù)。SMALLINT型數(shù)據(jù)可以存儲從-32768到32768的整數(shù)。這種數(shù)據(jù)類型的使用方法與INT型完全相同。最后,如果你實在需要節(jié)省空間,你可以使用TINYINT型數(shù)據(jù)。同樣,這種類型的使用方法也與INT型相同,不同的是這種類型的字段只能存儲從0到255的整數(shù)。TINYINT型字段不能用來存儲負數(shù)。通常,為了節(jié)省空間,應(yīng)該盡可能的使用最小的整型數(shù)據(jù)。一個TINYINT型數(shù)據(jù)只占用一個字節(jié);一個INT型數(shù)據(jù)占用四個字節(jié)。這看起來似乎差別不大,但是在比較大的表中,字節(jié)數(shù)的增長是很快的。另一方面,一旦你已經(jīng)創(chuàng)建了一個字段,要修改它是很困難的。因此,為安全起見,你應(yīng)該預(yù)測以下,一個字段所需要存儲的數(shù)值最大有可能是多大,然后選擇適當?shù)臄?shù)據(jù)類型。為了能對字段所存放的數(shù)據(jù)有更多的控制,你可以使用NUMERIC型數(shù)據(jù)來同時表示一個數(shù)的整數(shù)部分和小數(shù)部分。NUMERIC型數(shù)據(jù)使你能表示非常大的數(shù)——比INT型數(shù)據(jù)要大得多。一個NUMERIC型字段可以存儲從-1038到1038范圍內(nèi)的數(shù)。NUMERIC型數(shù)據(jù)還使你能表示有小數(shù)部分的數(shù)。例如,你可以在NUMERIC型字段中存儲小數(shù)3.14。當定義一個NUMERIC型字段時,你需要同時指定整數(shù)部分的大小和小數(shù)部分的大小。這里有一個使用這種數(shù)據(jù)類型的例子:CREATETABLEnumeric_data(bignumberNUMERIC(28,0),fractionNUMERIC(5,4))當這個語句執(zhí)行時,將創(chuàng)建一個名為numeric_data的包含兩個字段的表。字段bignumber可以存儲直到28位的整數(shù)。字段fraction可以存儲有五位整數(shù)部分和四位小數(shù)部分的小數(shù)。一個NUMERIC型數(shù)據(jù)的整數(shù)部分最大只能有28位,小數(shù)部分的位數(shù)必須小于或等于整數(shù)部分的位數(shù),小數(shù)部分可以是零。你可以使用INT型或NUMERIC型數(shù)據(jù)來存儲錢數(shù)。但是,專門有另外兩種數(shù)據(jù)類型用于此目的。如果你希望你的網(wǎng)點能掙很多錢,你可以使用MONEY型數(shù)據(jù)。如果你的野心不大,你可以使用SMALLMONEY型數(shù)據(jù)。MONEY型數(shù)據(jù)可以存儲從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數(shù)。如果你需要存儲比這還大的金額,你可以使用NUMERIC型數(shù)據(jù)。SMALLMONEY型數(shù)據(jù)只能存儲從-214,748.3648到214,748.3647的錢數(shù)。同樣,如果可以的話,你應(yīng)該用SMALLMONEY型來代替MONEY型數(shù)據(jù),以節(jié)省空間。下面的例子顯示了如何使用這兩種表示錢的數(shù)據(jù)類型:CREATETABLEproducts(productVARCHAR(40),priceMONEY,Discount_priceSMALLMONEY)這個表可以用來存儲商品的折扣和普通售價。字段price的數(shù)據(jù)類型是MONEY,字段discount_price的數(shù)據(jù)類型是SMALLMONEY。存儲邏輯值如果你使用復(fù)選框(CHECKBOX)從網(wǎng)頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:0或1。這里有一個如何使用這種字段的例子:CREATETABLEopinion(visitorVARCHAR(40),goodBIT)這個表可以用來存放對你的網(wǎng)點進行民意調(diào)查所得的信息。訪問者可以投票表示他們是否喜歡你的網(wǎng)點。如果他們投YES,就在BIT型字段中存入1。反之,如果他們投NO,就在字段中存入0(在下一章里,你將學會如何計算投票)。當心,在你創(chuàng)建好一個表之后,你不能向表中添加BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創(chuàng)建表時完成。存儲日期和時間當你建立一個網(wǎng)點時,你也許需要記錄在一段時間內(nèi)的訪問者數(shù)量。為了能夠存儲日期和時間,你需要使用DATETIME型數(shù)據(jù),如下例所示:CREATETABLvisitorlog(visitorVARCHAR(40),arrivaltimeDATETIME,departuretimeDATETIME)這個表可以用來記錄訪問者進入和離開你網(wǎng)點的時間和日期。一個DATETIME型的字段可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。如果你不需要覆蓋這么大范圍的日期和時間,你可以使用SMALLDATETIME型數(shù)據(jù)。它與DATETIME型數(shù)據(jù)同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數(shù)據(jù)小,而且不如DATETIME型數(shù)據(jù)精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。DATETIME型字段在你輸入日期和時間之前并不包含實際的數(shù)據(jù),認識這一點是重要的。在下一章,你將學習怎樣使用大量的SQL函數(shù)來讀取和操作日期和時間(參見下面的“缺省值”一節(jié))。你也可以在VBScript和JScript中使用日期和時間函數(shù)來向一個DATETIME型字段中輸入日期和時間。字段屬性上一節(jié)介紹了如何建立包含不同類型字段的表。在這一節(jié)中,你將學會如何使用字段的三個屬性。這些屬性允許你控制空值,缺省值和標識值。允許和禁止空值大多數(shù)字段可以接受空值(NULL)。當一個字段接受了空值后,如果你不改變它,它將一直保持空值。空值(NULL)和零是不同的,嚴格的說,空值表示沒有任何值。為了允許一個字段接受空值,你要在字段定義的后面使用表達式NULL。例如,下面的表中兩個字段都允許接受空值:CREATETABLEempty(empty1CHAR(40)NULL,empty2INTNULL(注意:BIT型數(shù)據(jù)不能是空值。一個這種類型的字段必須取0或者1。有時你需要禁止一個字段使用空值。例如,假設(shè)有一個表存儲著信用卡號碼和信用卡有效日期,你不會希望有人輸入一個信用卡號碼但不輸入有效日期。為了強制兩個字段都輸入數(shù)據(jù),你可以用下面的方法建立這個表:CREATETABLEcreditcards(creditcard_numberCHAR(20)NOTNULL,Creditcard_expireDATETIMENOTNULL)注意字段定義的后面跟有表達式NOTNULL。通過包含表達式NOTNULL,你可以禁止任何人只在一個字段中插入數(shù)據(jù),而不輸入另一個字段的數(shù)據(jù)。你將會發(fā)現(xiàn),在你建設(shè)自己的網(wǎng)點過程中,這種禁止空值的能力是非常有用的。如果你指定一個字段不能接受空值,那么當你試圖輸入一個空值時,會有錯誤警告。這些錯誤警告可以為程序調(diào)試提供有價值的線索。缺省值假設(shè)有一個存儲地址信息的表,這個表的字段包括街道、城市、州、郵政編碼和國家。如果你預(yù)計地址的大部分是在美國,你可以把這個值作為country字段的缺省值。為了在創(chuàng)建一個表時指定缺省值,你可以使用表達式DEFAULT。請看下面這個在創(chuàng)建表時使用缺省值的例子:CREATETABLEaddresses(streetVARCHAR(60)NULL,cityVARCHAR(40)NULL,stateVARCHAR(20)NULLzipVARCHAR(20)NULL,countryVARCHAR(30)DEFAULT‘USA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版公園雕塑藝術(shù)教育推廣合作合同3篇
- 2025年人教A新版選修3物理上冊月考試卷
- 2025年浙教新版九年級生物上冊月考試卷
- 2023二年級語文上冊 第六單元 15 八角樓上說課稿 新人教版
- 2025年度特色餐廳裝飾裝修與綠色建材采購合同3篇
- 二零二五年度冷鏈物流承包項目合同范本4篇
- 2025年度棉被品牌合作開發(fā)合同4篇
- 二零二五版房屋共有權(quán)公證與房屋租賃風險防范合同3篇
- 二零二五年度住宅租賃代理服務(wù)標準合同4篇
- 2025年度林業(yè)生態(tài)修復(fù)與林權(quán)補償協(xié)議4篇
- 大學生國家安全教育意義
- 2024年保育員(初級)培訓計劃和教學大綱-(目錄版)
- 河北省石家莊市2023-2024學年高二上學期期末考試 語文 Word版含答案
- 企業(yè)正確認識和運用矩陣式管理
- 分布式光伏高處作業(yè)專項施工方案
- 陳閱增普通生物學全部課件
- 檢驗科主任就職演講稿范文
- 人防工程主體監(jiān)理質(zhì)量評估報告
- 20225GRedCap通信技術(shù)白皮書
- 燃氣有限公司客戶服務(wù)規(guī)范制度
- 延遲交稿申請英文
評論
0/150
提交評論