




已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三部分 操作數(shù)據(jù):SQL 本部分內(nèi)容 n SQL基礎(chǔ) n 中級(jí)SQL n 高級(jí)SQL 第10章 SQL基礎(chǔ) 本章內(nèi)容 SQL介紹 使用SELECT 語句從表中取數(shù)據(jù) 創(chuàng)建新表 字段屬性 向表中添加數(shù)據(jù) 刪除和修改表 為了建立交互站點(diǎn),你需要使用數(shù)據(jù)庫來存儲(chǔ)來自訪問者的信息。例如,你要建立一個(gè)職業(yè)介紹服務(wù)的站點(diǎn),你就需要存儲(chǔ)諸如個(gè)人簡(jiǎn)歷,所感興趣的工作等等這樣的信息。創(chuàng)建動(dòng)態(tài)網(wǎng)葉也需要使用數(shù)據(jù)庫,如果你想顯示符合來訪者要求的最好的工作,你就需要從數(shù)據(jù)庫中取出這份工作的信息。你將會(huì)發(fā)現(xiàn),在許多情況下需要使用數(shù)據(jù)庫。 在這一章里,你將學(xué)會(huì)怎樣使用“結(jié)構(gòu)化查詢語言”(SQL來操作數(shù)據(jù)庫。SQL語言是數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。在Active Sever Pages 中,無論何時(shí)你要訪問一個(gè)數(shù)據(jù)庫,你就要使用SQL語言。因此,掌握好SQL對(duì)ASP編程是非常重要的。 注意: 你可以把“SQL”讀作“sequel”,也可以按單個(gè)字母的讀音讀作SQL。 兩種發(fā)音都是正確的,每種發(fā)音各有大量的支持者。在本書里,認(rèn)為“SQL”讀作“sequel”。 通過這一章的學(xué)習(xí),你將理解怎樣用SQL實(shí)現(xiàn)數(shù)據(jù)庫查詢,你將學(xué)會(huì)怎樣使用這種查詢從數(shù)據(jù)表中取出信息,最后,你將學(xué)會(huì)怎樣設(shè)計(jì)和建立自己的數(shù)據(jù)庫。 注意: 通過下面幾章對(duì)SQL的介紹,你將對(duì)SQL有足夠的了解,從而可以有效地使用Active Sever Pages。但是,SQL是一種復(fù)雜的語言,本書不可能包括它的全部細(xì)節(jié)。要全面掌握SQL語言,你需要學(xué)習(xí)在Microsoft SQL Sever 中使用SQL。你可以到附近的書店去買一本Microsoft SQL Sever 6.5。SQL介紹: 本書假設(shè)你是在SQL操作Microsoft SQL Sever 的數(shù)據(jù)庫。你也可以用SQL操作許多其它類型的數(shù)據(jù)庫。SQL是操作數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。(事實(shí)上,關(guān)于SQL語言有一個(gè)專門的ANSI標(biāo)準(zhǔn) 注意: 不要在你的站點(diǎn)上試圖用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同時(shí)服務(wù)于許多用戶,如果你希望你的站點(diǎn)有較高的訪問率,MS Access是不能勝任的。 在學(xué)習(xí)SQL的細(xì)節(jié)之前,你需要理解它的兩大特點(diǎn)。一個(gè)特點(diǎn)容易掌握,另一個(gè)掌握起來有點(diǎn)困難。 第一個(gè)特點(diǎn)是所有SQL數(shù)據(jù)庫中的數(shù)據(jù)都存儲(chǔ)在表中。一個(gè)表由行和列組成。例如,下面這個(gè)簡(jiǎn)單的表包括name 和e-mail address: Name Email Address . Bill Gates president Clinton Stephen Walther 這個(gè)表有兩列(列也稱為字段,域:Name和Email Address。有三行,每一行包含一組數(shù)據(jù)。一行中的數(shù)據(jù)組合在一起稱為一條記錄。 無論何時(shí)你向表中添加新數(shù)據(jù),你就添加了一條新記錄。一個(gè)數(shù)據(jù)表可以有幾十個(gè)記錄,也可以有幾千甚至幾十億個(gè)記錄。雖然你也許永遠(yuǎn)不需要存儲(chǔ)十億個(gè)Email地址,但知道你能這樣做總是好的,也許有一天你會(huì)有這樣的需要。 你的數(shù)據(jù)庫很有可能包含幾十個(gè)表,所有存儲(chǔ)在你數(shù)據(jù)庫中的信息都被存儲(chǔ)在這些表中。當(dāng)你考慮怎樣把信息存儲(chǔ)在數(shù)據(jù)庫中時(shí),你應(yīng)該考慮怎樣把它們存儲(chǔ)在表中。 SQL的第二個(gè)特點(diǎn)有些難于掌握。這種語言被設(shè)計(jì)為不允許你按照某種特定的順序來取出記錄,因?yàn)檫@樣做會(huì)降低SQL Sever取記錄的效率。使用SQL,你只能按查詢條件來讀取記錄。 當(dāng)考慮如何從表中取出記錄時(shí),自然會(huì)想到按記錄的位置讀取它們。例如,也許你會(huì)嘗試通過一個(gè)循環(huán),逐個(gè)記錄地掃描,來選出特定的記錄。在使用SQL時(shí),你必須訓(xùn)練自己,不要有這種思路。 假如你想選出所有的名字是“Bill Gates”的記錄,如果使用傳統(tǒng)的編程語言,你也許會(huì)構(gòu)造一個(gè)循環(huán),逐個(gè)查看表中的記錄,看名字域是否是“Bill Gates”。 這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說,“選擇所有名字域等于Bill Gates的記錄”,SQL就會(huì)為你選出所有符合條件的記錄。SQL會(huì)確定實(shí)現(xiàn)查詢的最佳方法。 建設(shè)你想取出表中的前十個(gè)記錄。使用傳統(tǒng)的編程語言,你可以做一個(gè)循環(huán),取出前十個(gè)記錄后結(jié)束循環(huán)。但使用標(biāo)準(zhǔn)的SQL查詢,這是不可能實(shí)現(xiàn)的。從SQL的角度來說,在一個(gè)表中不存在前十個(gè)記錄這種概念。 開始時(shí),當(dāng)你知道你不能用SQL實(shí)現(xiàn)某些你感覺應(yīng)該能實(shí)現(xiàn)的功能,你會(huì)受到挫折。你也許會(huì)以頭撞墻甚至想寫惡毒的信件給SQL的設(shè)計(jì)者們。但后來你會(huì)認(rèn)識(shí)到,SQL的這個(gè)特點(diǎn)不僅不是個(gè)限制,反而是其長(zhǎng)處。因?yàn)镾QL不根據(jù)位置來讀取記錄,它讀取記錄可以很快。 綜上所述,SQL有兩個(gè)特點(diǎn):所有數(shù)據(jù)存儲(chǔ)在表中,從SQL的角度來說,表中的記錄沒有順序。在下一節(jié),你將學(xué)會(huì)怎樣用SQL從表中選擇特殊的記錄。使用SQL從表中取記錄。 SQL的主要功能之一是實(shí)現(xiàn)數(shù)據(jù)庫查詢。如果你熟悉Internet 引擎,那么你已經(jīng)熟悉查詢了。你使用查詢來取得滿足特定條件的信息。例如,如果你想找到有ASP信息的全部站點(diǎn),你可以連接到 Yahoo!并執(zhí)行一個(gè)對(duì)Active Sever Pages的搜索。在你輸入這個(gè)查詢后,你會(huì)收到一個(gè)列表,表中包括所有其描述中包含搜索表達(dá)式的站點(diǎn)。 多數(shù)Internet 引擎允許邏輯查詢。在邏輯查詢中,你可以包括特殊的運(yùn)算符如AND、OR和NOT,你使用這些運(yùn)算符來選擇特定的記錄。例如,你可以用AND來限制查詢結(jié)果。如果你執(zhí)行一個(gè)對(duì)Active Sever Pages AND SQL的搜索。你將得到其描述中同時(shí)包含Active Sever Pages 和SQL的記錄。當(dāng)你需要限制查詢結(jié)果時(shí),你可以使用AND。 如果你需要擴(kuò)展查詢的結(jié)果,你可以使用邏輯操作符OR。例如,如果你執(zhí)行一個(gè)搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站點(diǎn),你收到的列表中將包括所有其描述中同時(shí)包含兩個(gè)表達(dá)式或其中任何一個(gè)表達(dá)式的站點(diǎn)。 如果你想從搜索結(jié)果中排除特定的站點(diǎn),你可以使用NOT。例如,查詢“Active Sever Pages ”AND NOT “SQL”將返回一個(gè)列表,列表中的站點(diǎn)包含Active Sever Pages,但不包含SQL。當(dāng)必須排除特定的記錄時(shí),你可以使用NOT。 用SQL執(zhí)行的查詢與用Internet搜索引擎執(zhí)行的搜索非常相似。 當(dāng)你執(zhí)行一個(gè)SQL查詢時(shí),通過使用包括邏輯運(yùn)算符的查詢條件,你可以得到一個(gè)記錄列表。此時(shí)查詢結(jié)果是來自一個(gè)或多個(gè)表。 SQL查詢的句法非常簡(jiǎn)單。假設(shè)有一個(gè)名為email_table 的表,包含名字和地址兩個(gè)字段,要得到Bill Gates 的e_mail地址,你可以使用下面的查詢: SELECT email from email_table WHERE name=Bill Gates 當(dāng)這個(gè)查詢執(zhí)行時(shí),就從名為email_table的表中讀取Bill Gates的e_mail 地址。這個(gè)簡(jiǎn)單的語句包括三部分: SELECT語句的第一部分指名要選取的列。在此例中,只有email列被選取。當(dāng)執(zhí)行 時(shí),只顯示email列的值 。 SELECTT語句的第二部份指明要從哪個(gè)(些)表中查詢數(shù)據(jù)。在此例中,要查詢的表名為email_table 。 最后,SELECT語句的WHERE子句指明要選擇滿足什么條件的記錄。在此例中,查詢條件為只有name列的值為Bill Gates 的記錄才被選取。 Bill Gates很有可能擁有不止一個(gè)email地址。如果表中包含Bill Gates的多個(gè)email地址。用上述的SELECT語句可以讀取他所有的email地址。SELECT語句從表中取出所有name字段值為Bill Gates 的記錄的email 字段的值。 前面說過,查詢可以在查詢條件中包含邏輯運(yùn)算符。假如你想讀取Bill Gates 或Clinton總統(tǒng)的所有email地址,你可以使用下面的查詢語句: SELECT email FROM email_table WHERE name=Bill Gates OR name=president Clinton 此例中的查詢條件比前一個(gè)復(fù)雜了一點(diǎn)。這個(gè)語句從表email_table中選出所有name列為Bill Gates或president Clinton的記錄。如果表中含有Bill Gates或president Clinton的多個(gè)地址,所有的地址都被讀取。 SELECT語句的結(jié)構(gòu)看起來很直觀。如果你請(qǐng)一個(gè)朋友從一個(gè)表中為你選擇一組記錄,你也許以非常相似的方式提出你的要求。在SQL SELECT語句中,你“SELECT特定的列FROM一個(gè)表WHERE某些列滿足一個(gè)特定的條件”。 下一節(jié)將介紹怎樣執(zhí)行SQL查詢來選取記錄。這將幫助你熟悉用SELECT語句從表中取數(shù)據(jù)的各種不同方法。使用ISQL執(zhí)行SELECT查詢 當(dāng)你安裝SQL Sever時(shí),你同時(shí)安裝了一個(gè)叫作ISQL/w的應(yīng)用程序。ISQL/w允許你執(zhí)行交互的SQL查詢。在把查詢包括到你的ASP網(wǎng)頁中之前,用ISQL/w對(duì)其進(jìn)行測(cè)試是非常有用的。 注意: 在這本書的第一部份,你學(xué)習(xí)了怎樣安裝和配置Microsoft SQL Sever 。如果沒有安裝SQL Sever或者SQL Sever不能運(yùn)行,請(qǐng)參閱第三章“安裝和使用SQL Sever”。 選擇任務(wù)上SQL Sever程序組中的ISQL_w以啟動(dòng)該程序。程序啟動(dòng)時(shí),首先會(huì)出現(xiàn)一個(gè)對(duì)話框,要求輸入服務(wù)器信息和登錄信息(見圖10.1)。在Sever框中,輸入你的SQL服務(wù)器的名字。如果服務(wù)器正運(yùn)行在本地計(jì)算機(jī)上,服務(wù)器名字就是你計(jì)算機(jī)的名字。在登錄信息框中,輸入一個(gè)登錄帳號(hào)和密碼或選擇使用“可信連接”,然后單擊Connect按鈕。 圖10。1 注意: 如果你將SQL Sever配置為使用完整安全或混合安全,那么你可以使用可信連接。如果你使用標(biāo)準(zhǔn)安全,你則需要提供用戶帳號(hào)和密碼。要了解更多信息,參見第三章。 如果一切正常,在你單擊連接按鈕后會(huì)出現(xiàn)一個(gè)查詢窗口,如圖10.2所示。(如果有異常,請(qǐng)參考第三章) 圖10.2 在執(zhí)行查詢之前,你需要選擇數(shù)據(jù)庫。安裝 SQL Sever時(shí)你已為自己創(chuàng)建了一個(gè)數(shù)據(jù)庫,SQL Sever還有許多系統(tǒng)數(shù)據(jù)庫,如master,model,msdb,和tempdb。 方便的是,SQL Sever帶有一個(gè)特殊的名為pubs的例子數(shù)據(jù)庫。庫 pubs中包含供一個(gè)虛擬的出版商使用的各個(gè)表。文檔中所有的例子程序都是針對(duì)這個(gè)庫來設(shè)計(jì)的。本書中的許多例子也使用這個(gè)數(shù)據(jù)庫。 在查詢窗口頂部的DB下拉框中選擇數(shù)據(jù)庫pubs,這樣你就選擇了數(shù)據(jù)庫。你所有的查詢都將針對(duì)這個(gè)庫中的各個(gè)表來執(zhí)行?,F(xiàn)在你可以執(zhí)行你的第一個(gè)查詢了。這真讓人興奮! 你的第一個(gè)查詢將針對(duì)一個(gè)名為autrors的表,表中包含所有為某個(gè)虛擬出版商工作的作者的相關(guān)數(shù)據(jù)。單擊查詢窗口并輸入以下的語句: SELECT phone FROM authors WHERE au_name=Ringer 輸入完成后,單擊執(zhí)行查詢按鈕(一個(gè)綠色三角形,看起來像VCR播放鍵)。單擊此按鈕后,任何出現(xiàn)在查詢窗口中的語句均會(huì)被執(zhí)行。查詢窗口會(huì)自動(dòng)變成結(jié)果顯示窗口,你可以看到查詢的結(jié)果(見圖10.3)。 你看到的查詢結(jié)果也許與圖10.3所示的不同。在SQL Sever的不同版本中,庫pubs中的數(shù)據(jù)會(huì)有所不同。對(duì)SQL Sever 6.5來說,將會(huì)找到兩條記錄。結(jié)果顯示窗口中應(yīng)顯示如下內(nèi)容: phone.801 826_0752801 826_0752 (2 row(s) affected) 圖10.3 你所執(zhí)行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號(hào)碼。你通過在WHERE子句中使用特殊的選擇條件來限制查詢的結(jié)果。你也可以忽略選擇條件,從表中取出所有作者的電話號(hào)碼。要做到這一點(diǎn),單擊Query標(biāo)簽,返回到查詢窗口,輸入以下的SELECT語句:SELECT Phone FROM authors 這個(gè)查詢執(zhí)行后,會(huì)取出表authors中的所有電話號(hào)碼(沒有特定的順序)。如果表authors中包含一百個(gè)電話號(hào)碼,會(huì)有一百個(gè)記錄被取出,如果表中有十億個(gè)電話號(hào)碼,這十億條記錄都會(huì)被取出(這也許需要一些時(shí)間)。 表authrs的字段包括姓,名字,電話號(hào)碼,地址,城市,州和郵政編碼。通過在SELECT語句的第一部份指定它們,你可以從表中取出任何一個(gè)字段。你可以在一個(gè)SELECT語句中一次取出多個(gè)字段,比如: SELECT au_fname ,au_lname, phone FROM authors 這個(gè)SELECT語句執(zhí)行后,將取出這三個(gè)列的所有值。下面是這個(gè)查詢的結(jié)果的一個(gè)示例(為了節(jié)省紙張,只顯示查詢結(jié)果的一部分,其余記錄用省略號(hào)代替): au_fname au_lname phone . Johnson White 408 496_7223 Marjorie Green 415 986_7020 Cheryl Carson 415 548_7723 Michael OLeary 408 286_2428 (23 row(s) affected) 在SELECT語句中,你需要列出多少個(gè)字段,你就可以列出多少。不要忘了把字段名用逗號(hào)隔開。你也可以用星號(hào)(*)從一個(gè)表中取出所有的字段。這里有一個(gè)使用星號(hào)的例子: SELECT * FROM authors 這個(gè)SELECT語句執(zhí)行后,表中的所有字段的值都被取出。你會(huì)發(fā)現(xiàn)你將在SQL查詢中頻繁使用星號(hào)。 技巧: 你可以使用星號(hào)來查看一個(gè)表的所有列的名字。要做到這一點(diǎn),只需要在執(zhí)行完SELECT語句后看一下查詢結(jié)果的列標(biāo)題。操作多個(gè)表 到現(xiàn)在為止,你只嘗試了用一句SQL查詢從一個(gè)表中取出數(shù)據(jù)。你也可以用一個(gè)SELECT語句同時(shí)從多個(gè)表中取出數(shù)據(jù),只需在SELECT語句的FROM從句中列出要從中取出數(shù)據(jù)的表名稱即可: SELECT au_lname ,title FROM authors, titles 這個(gè)SELECT語句執(zhí)行時(shí),同時(shí)從表authors和表titles中取出數(shù)據(jù)。從表authors中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執(zhí)行這個(gè)查詢,看一下查詢結(jié)果。你會(huì)發(fā)現(xiàn)一些奇怪的出乎意料的情況:作者的名字并沒有和它們所著的書相匹配,而是出現(xiàn)了作者名字和書名的所有可能的組合,這也許不是你所希望見到的。 出了什么差錯(cuò)?問題在于你沒有指明這兩個(gè)表之間的關(guān)系。你沒有通過任何方式告訴SQL如何把表和表關(guān)聯(lián)在一起。由于不知道如何關(guān)聯(lián)兩個(gè)表,服務(wù)器只能簡(jiǎn)單地返回取自兩個(gè)表中的記錄的所有可能組合。 要從兩個(gè)表中選出有意義的記錄組合,你需要通過建立兩表中字段的關(guān)系來關(guān)聯(lián)兩個(gè)表。要做到這一點(diǎn)的途徑之一是創(chuàng)建第三個(gè)表,專門用來描述另外兩個(gè)表的字段之間的關(guān)系。 表authors有一個(gè)名為au_id的字段,包含有每個(gè)作者的唯一標(biāo)識(shí)。表titles有一個(gè)名為title_id的字段,包含每個(gè)書名的唯一標(biāo)識(shí)。如果你能在字段au_id和字段title_id 之間建立一個(gè)關(guān)系,你就可以關(guān)聯(lián)這兩個(gè)表。數(shù)據(jù)庫pubs中有一個(gè)名為titleauthor的表,正是用來完成這個(gè)工作。表中的每個(gè)記錄包括兩個(gè)字段,用來把表titles和表authors關(guān)聯(lián)在一起。下面的SELECT語句使用了這三個(gè)表以得到正確的結(jié)果: SELECT au_name,title FROM authors,titles,titleauthor WHERE authors.au_id=titleauthor.au_id AND titles.title_id=titleauthor.title_id 當(dāng)這個(gè)SELECT語句執(zhí)行時(shí),每個(gè)作者都將與正確的書名相匹配。表titleauthor指明了表authors和表titles的關(guān)系,它通過包含分別來自兩個(gè)表的各一個(gè)字段實(shí)現(xiàn)這一點(diǎn)。第三個(gè)表的唯一目的是在另外兩個(gè)表的字段之間建立關(guān)系。它本身不包含任何附加數(shù)據(jù)。 注意在這個(gè)例子中字段名是如何書寫的。為了區(qū)別表authors和表titles中相同的字段名au_id,每個(gè)字段名前面都加上了表名前綴和一個(gè)句號(hào)。名為author.au_id 的字段屬于表authors,名為titleauthor.au_id的字段屬于表titleauthor,兩者不會(huì)混淆。 通過使用第三個(gè)表,你可以在兩個(gè)表的字段之間建立各種類型的關(guān)系。例如,一個(gè)作者也許寫了許多不同的書,或者一本書也許由許多不同的作者共同完成。當(dāng)兩個(gè)表的字段之間有這種“多對(duì)多”的關(guān)系時(shí),你需要使用第三個(gè)表來指明這種關(guān)系。 但是,在許多情況下,兩個(gè)表之間的關(guān)系并不復(fù)雜。比如你需要指明表titles和表publishers之間的關(guān)系。因?yàn)橐粋€(gè)書名不可能與多個(gè)出版商相匹配,你不需要通過第三個(gè)表來指明這兩個(gè)表之間的關(guān)系。要指明表titles和表publishers之間的關(guān)系,你只要讓這兩個(gè)表有一個(gè)公共的字段就可以了。在數(shù)據(jù)庫pubs中,表titles和表publishers都有一個(gè)名為pub_id的字段。如果你想得到書名及其出版商的一個(gè)列表,你可以使用如下的語句: SELECT title,pub_name FROM titles,publishers WHERE titles.pub_id=publishers.pub_id 當(dāng)然,如果一本書是由兩個(gè)出版商聯(lián)合出版的,那么你需要第三個(gè)表來代表這種關(guān)系。 通常,當(dāng)你予先知道兩個(gè)表的字段間存在“多對(duì)多”關(guān)系時(shí),就使用第三個(gè)表來關(guān)聯(lián)這兩個(gè)表。反之,如果兩個(gè)表的字段間只有“一對(duì)一”或“一對(duì)多”關(guān)系,你可以使用公共字段來關(guān)聯(lián)它門。操作字段 通常,當(dāng)你從一個(gè)表中取出字段值時(shí),該值與創(chuàng)建該表時(shí)所定義的字段名聯(lián)系在一起。如果你從表authors中選擇所有的作者名字,所有的值將會(huì)與字段名au_lname相聯(lián)系。但是在某些情況下,你需要對(duì)字段名進(jìn)行操作。在SELECT語句中,你可以在缺省字段名后面僅跟一個(gè)新名字來取代它。例如,可以用一個(gè)更直觀易讀的名字Author Last Name來代替字段名au_lname: SELECT au_lname Author Last Name FROM authors 當(dāng)這個(gè)SELECT語句執(zhí)行時(shí),來自字段au_lname的值會(huì)與“Author Last Name”相聯(lián)系。查詢結(jié)果可能是這樣: Author Last Name . White Green Carson OLeary Straight (23 row(s) affected) 注意字段標(biāo)題不再是au_lname,而是被Author Last Name所取代。 你也可以通過執(zhí)行運(yùn)算,來操作從一個(gè)表返回的字段值。例如,如果你想把表titles中的所有書的價(jià)格加倍,你可以使用下面的SELECT語句: SELECT price*2 FROM titles 當(dāng)這個(gè)查詢執(zhí)行時(shí),每本書的價(jià)格從表中取出時(shí)都會(huì)加倍。但是,通過這種途徑操作字段不會(huì)改變存儲(chǔ)在表中的書價(jià)。對(duì)字段的運(yùn)算只會(huì)影響SELECT語句的輸出,而不會(huì)影響表中的數(shù)據(jù)。為了同時(shí)顯示書的原始價(jià)格和漲價(jià)后的新價(jià)格,你可以使用下面的查詢:SELECT price Original price, price*2 New price FROM titles 當(dāng)數(shù)據(jù)從表titles中取出時(shí),原始價(jià)格顯示在標(biāo)題Original price下面,加倍后的價(jià)格顯示在標(biāo)題New price下面。結(jié)果可能是這樣: original price new price .19.99 39.9811.95 23.90 2.99 5.9819.99 39.98(18 row(s) affected) 你可以使用大多數(shù)標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算符來操作字段值,如加(+),減(-),乘(*)和除(/)。你也可以一次對(duì)多個(gè)字段進(jìn)行運(yùn)算,例如: SELECT price*ytd_sales total revenue FROM titles 在這個(gè)例子中,通過把價(jià)格與銷售量相乘,計(jì)算出了每種書的總銷售額。這個(gè)SELECT語句的結(jié)果將是這樣的: total revenue . 81,859,05 46,318,20 55,978,78 81,859,05 40,619,68 (18 row(s) affected) 最后,你還可以使用連接運(yùn)算符(它看起來像個(gè)加號(hào))來連接兩個(gè)字符型字段: SELECT au_fname+ +au_lname author name FROM authors 在這個(gè)例子中,你把字段au_fname和字段au_lname粘貼在一起,中間用一個(gè)逗號(hào) 隔開,并把查詢結(jié)果的標(biāo)題指定為author name。這個(gè)語句的執(zhí)行結(jié)果將是這樣的: author names Johnson White Marjorie Green Cheryl Carson Michael OLeary Dean Straight (23 row(s) affected) 可以看到,SQL為你提供了對(duì)查詢結(jié)果的許多控制。你應(yīng)該在ASP編程過程中充分利用這些優(yōu)點(diǎn)。使用SQL來操作查詢結(jié)果幾乎總是比使用有同樣作用的腳本效率更高。排序查詢結(jié)果 本章的介紹中曾強(qiáng)調(diào)過,SQL表沒有內(nèi)在的順序。例如,從一個(gè)表中取第二個(gè)記錄是沒有意義的。從SQL的角度看來,沒有一個(gè)記錄在任何其他記錄之前。然而,你可以操縱一個(gè)SQL查詢結(jié)果的順序。在缺省情況下,當(dāng)記錄從表中取出時(shí),記錄不以特定的順序出現(xiàn)。例如,當(dāng)從表authors中取出字段au_lname時(shí),查詢結(jié)果顯示成這樣: au_lname . White Green Carson OLeary Straight (23 row(s) affected) 看一列沒有特定順序的名字是很不方便的。如果把這些名字按字母順序排列,讀起來就會(huì)容易得多。通過使用ORDER BY子句,你可以強(qiáng)制一個(gè)查詢結(jié)果按升序排列,就像這樣: SELECT au_lname FROM authors ORDER BY au_lname 當(dāng)這個(gè)SELECT語句執(zhí)行時(shí),作者名字的顯示將按字母順序排列。ORDER BY子句將作者名字按升序排列。 你也可以同時(shí)對(duì)多個(gè)列使用ORDER BY子句。例如,如果你想同時(shí)按升序顯示字段au_lname和字段au_fname,你需要對(duì)兩個(gè)字段都進(jìn)行排序: SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname 這個(gè)查詢首先把結(jié)果按au_lname字段進(jìn)行排序,然后按字段au_fname排序。記錄將按如下的順序取出: au_lname au_fname . Bennet Abraham Ringer Albert Ringer Anne Smith Meander (23 row(s) affected) 注意有兩個(gè)作者有相同的名字Ringer。名為Albert Ringer的作者出現(xiàn)名為Anne Ringer的作者之前,這是因?yàn)樾誂lbert按字母順序應(yīng)排在姓Anne之前。如果你想把查詢結(jié)果按相反的順序排列,你可以使用關(guān)鍵字DESC。關(guān)鍵字DESC把查詢結(jié)果按降序排列,如下例所示: SELECT au_lname,au_fname FROM authors WHERE au_lname=”Ringer” ORDER BY au_lname ,au_fname DESC 這個(gè)查詢從表authors中取出所有名字為Ringer的作者記錄。ORDER BY子句根據(jù)作者的名字和姓,將查詢結(jié)果按降序排列。結(jié)果是這樣的: au_lname au_fname . Ringer Anne Ringer Albert (2 row(s) affectec) 注意在這個(gè)表中,姓Anne出現(xiàn)在姓Albert之前。作者名字按降序顯示。你也可以按數(shù)值型字段對(duì)一個(gè)查詢結(jié)果進(jìn)行排序。例如,如果你想按降序取出所有書的價(jià)格,你可以使用如下的SQL查詢: SELECT price FROM titles ORDER BY price DESC 這個(gè)SELECT語句從表中取出所有書的價(jià)格,顯示結(jié)果時(shí),價(jià)格低的書先顯示,價(jià)格高的書后顯示。 警告: 不是特別需要時(shí),不要對(duì)查詢結(jié)果進(jìn)行排序,因?yàn)榉?wù)器完成這項(xiàng)工作要費(fèi)些力氣。這意味著帶有ORDER BY 子句的SELECT語句執(zhí)行起來比一般的SELECT語句花的時(shí)間長(zhǎng)。取出互不相同的記錄 一個(gè)表有可能在同一列中有重復(fù)的值。例如,數(shù)據(jù)庫pubs的表authors中有兩個(gè)作者的名字是Ringer。如果你從這個(gè)表中取出所有的名字,名字Ringer將會(huì)顯示兩次。 在特定情況下,你可能只有興趣從一個(gè)表中取出互不相同的值。如果一個(gè)字段有重復(fù)的值,你也許希望每個(gè)值只被選取一次,你可以使用關(guān)鍵字DISTINCT來做到這一點(diǎn): SELCET DISTINCT au_lname FROM authors WHERE au_lname=Ringer 當(dāng)這個(gè)SELECT語句執(zhí)行時(shí),只返回一個(gè)記錄。通過在SELECT語句中包含關(guān)鍵字DISTINCT,你可以刪除所有重復(fù)的值。例如,假設(shè)有一個(gè)關(guān)于新聞組信息發(fā)布的表,你想取出所有曾在這個(gè)新聞組中發(fā)布信息的人的名字,那么你可以使用關(guān)鍵字DISTINCT。每個(gè)用戶的名字只取一次盡管有的用戶發(fā)布了不止一篇信息。 警告: 如同ORDER BY子句一樣,強(qiáng)制服務(wù)器返回互不相同的值也會(huì)增加運(yùn)行開銷。福氣不得不花費(fèi)一些時(shí)間來完成這項(xiàng)工作。因此,不是必須的時(shí)候不要使用關(guān)鍵字DISTINCT。創(chuàng)建新表 前面說過,數(shù)據(jù)庫中的所有數(shù)據(jù)存儲(chǔ)在表中。數(shù)據(jù)表包括行和列。列決定了表中數(shù)據(jù)的類型。行包含了實(shí)際的數(shù)據(jù)。 例如,數(shù)據(jù)庫pubs中的表authors有九個(gè)字段。其中的一個(gè)字段名為為au_lname,這個(gè)字段被用來存儲(chǔ)作者的名字信息。每次向這個(gè)表中添加新作者時(shí),作者名字就被添加到這個(gè)字段,產(chǎn)生一條新記錄。 通過定義字段,你可以創(chuàng)建一個(gè)新表。每個(gè)字段有一個(gè)名字和一個(gè)特定的數(shù)據(jù)類型(數(shù)據(jù)類型在后面的“字段類型”一節(jié)中講述),例如字段au_lname存儲(chǔ)的是字符型數(shù)據(jù)。一個(gè)字段也可以存儲(chǔ)其它類型的數(shù)據(jù)。 使用SQL Sever,創(chuàng)建一個(gè)新表的方法是很多的。你可以可執(zhí)行一個(gè)SQL語句或使用SQL事務(wù)管理器(SQL Enterprise Manager)來創(chuàng)建一個(gè)新表。在下一節(jié)里,你將學(xué)會(huì)如何用SQL語句來創(chuàng)建一個(gè)新表。用SQL創(chuàng)建新表 注意: 如果你還沒有建立自己的數(shù)據(jù)庫,現(xiàn)在就跳回到第三章創(chuàng)建這個(gè)庫。你絕不能向master,tempdb或任何其他任何系統(tǒng)數(shù)據(jù)庫中添加數(shù)據(jù)。 從SQL Sever程序組(在任務(wù)欄中)中啟動(dòng)ISQL/w程序。出現(xiàn)查詢窗口后,從窗口頂部的下拉列表中選擇你在第三章所創(chuàng)建的數(shù)據(jù)庫。下一步,在查詢窗口中鍵入下面的SQL語句,單擊執(zhí)行查詢按鈕,執(zhí)行這個(gè)語句: CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)如果一切正常,你會(huì)在結(jié)果窗口中看到如下的文字(如果出現(xiàn)異常,請(qǐng)參閱第三章): This command dit not return data ,and it did not return any rows 祝賀你,你已經(jīng)建立了你的第一個(gè)表! 你所創(chuàng)建的表名為guestbook,你可以使用這個(gè)表來存儲(chǔ)來字你站點(diǎn)訪問者的信息。你是用REEATE TABLE語句創(chuàng)建的這個(gè)表,這個(gè)語句有兩部分:第一部份指定表的名子;第二部份是括在括號(hào)中的各字段的名稱和屬性,相互之間用逗號(hào)隔開。 表guestbook有三個(gè)字段:visitor,comments 和entrydate。visitor字段存儲(chǔ)訪問者的名字,comments字段存儲(chǔ)訪問者對(duì)你站點(diǎn)的意見,entrydate字段存儲(chǔ)訪問者訪問你站點(diǎn)的日期和時(shí)間。 注意每個(gè)字段名后面都跟有一個(gè)專門的表達(dá)式。例如,字段名comments后面跟有表達(dá)式TEXT。這個(gè)表達(dá)式指定了字段的數(shù)據(jù)類型。數(shù)據(jù)類型決定了一個(gè)字段可以存儲(chǔ)什么樣的數(shù)據(jù)。因?yàn)樽侄蝐omments包含文本信息,其數(shù)據(jù)類型定義為文本型。 字段有許多不同的數(shù)據(jù)類型。下一小節(jié)講述SQL所支持的一些重要的數(shù)據(jù)類型。字段類型 不同的字段類型用來存放不同類型的數(shù)據(jù)。創(chuàng)建和使用表時(shí),更你應(yīng)該理解五種常用的字段類型:字符型,文本型,數(shù)值型,邏輯性和日期型。字符型數(shù)據(jù) 字符型數(shù)據(jù)非常有用。當(dāng)你需要存儲(chǔ)短的字符串信息時(shí),你總是要用到字符型數(shù)據(jù)。例如,你可以把從HTML form的文本框中搜集到的信息放在字符型字段中。 要建立一個(gè)字段用來存放可變長(zhǎng)度的字符串信息,你可以使用表達(dá)式 VARCHAR。考慮你前面創(chuàng)建的表guestbook: CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME) 在這個(gè)例子中,字段visitor的數(shù)據(jù)類型為VARCHAR。注意跟在數(shù)據(jù)類型后面的括號(hào)中的數(shù)字。這個(gè)數(shù)字指定了這個(gè)字段所允許存放的字符串的最大長(zhǎng)度。在這個(gè)例子中,字段visitor能存放的字符串最長(zhǎng)為四十個(gè)字符。如果名字太長(zhǎng),字符串會(huì)被截?cái)啵槐A羲氖畟€(gè)字符。 VARCHAR類型可以存儲(chǔ)的字符串最長(zhǎng)為255個(gè)字符。要存儲(chǔ)更長(zhǎng)的字符串?dāng)?shù)據(jù),可以使用文本型數(shù)據(jù)(下一節(jié)中講述)。 另一種字符型數(shù)據(jù)用來存儲(chǔ)固定長(zhǎng)度的字符數(shù)據(jù)。下面是一個(gè)使用這種數(shù)據(jù)類型的例子: CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate DATETIME) 在這個(gè)例子中,字段visitor被用來存儲(chǔ)四十個(gè)字符的固定長(zhǎng)度字符串。表達(dá)式CHAR指定了這個(gè)字段應(yīng)該是固定長(zhǎng)度的字符串。 VARCHAR型和CHAR型數(shù)據(jù)的這個(gè)差別是細(xì)微的,但是非常重要。假如你向一個(gè)長(zhǎng)度為四十個(gè)字符的VARCHAR型字段中輸入數(shù)據(jù)Bill Gates。當(dāng)你以后從這個(gè)字段中取出此數(shù)據(jù)時(shí),你取出的數(shù)據(jù)其長(zhǎng)度為十個(gè)字符字符串Bill Gates的長(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)存和硬盤空間。當(dāng)你的數(shù)據(jù)庫很大時(shí),這種內(nèi)存和磁盤空間的節(jié)省會(huì)變得非常重要。文本型數(shù)據(jù) 字符型數(shù)據(jù)限制了字符串的長(zhǎng)度不能超過55個(gè)字符。而使用文本型數(shù)據(jù),你可以存放超過二十億個(gè)字符的字符串。當(dāng)你需要存儲(chǔ)大串的字符時(shí),應(yīng)該使用文本型數(shù)據(jù)。 這里有一個(gè)使用文本型數(shù)據(jù)的例子: CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME) 在這個(gè)例子中,字段comments被用來存放訪問者對(duì)你站點(diǎn)的意見。注意文本型數(shù)據(jù)沒有長(zhǎng)度,而上一節(jié)中所講的字符型數(shù)據(jù)是有長(zhǎng)度的。一個(gè)文本型字段中的數(shù)據(jù)通常要么為空,要么很大。 當(dāng)你從HTML form的多行文本編輯框(TEXTAREA)中收集數(shù)據(jù)時(shí),你應(yīng)該把收集的信息存儲(chǔ)于文本型字段中。但是,無論何時(shí),只要你能避免使用文本型字段,你就應(yīng)該不適用它。文本型字段既大且慢,濫用文本型字段會(huì)使服務(wù)器速度變慢。文本型字段還會(huì)吃掉大量的磁盤空間。 警告: 一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),就會(huì)有2K的空間被自動(dòng)分配給該數(shù)據(jù)。除非刪除該記錄,否則你無法收回這部分存儲(chǔ)空間。數(shù)值型數(shù)據(jù) SQL Sever支持許多種不同的數(shù)值型數(shù)據(jù)。你可以存儲(chǔ)整數(shù)、小數(shù)、和錢數(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ù)的例子: CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT) 這個(gè)表可以用來記錄你站點(diǎn)被訪問的次數(shù)。只要沒有人訪問你的站點(diǎn)超過2,147,483,647次,nubvisits字段就可以存儲(chǔ)訪問次數(shù)。 為了節(jié)省內(nèi)存空間,你可以使用SMALLINT型數(shù)據(jù)。SMALLINT 型數(shù)據(jù)可以存儲(chǔ)從-32768到32768的整數(shù)。這種數(shù)據(jù)類型的使用方法與INT型完全相同。 最后,如果你實(shí)在需要節(jié)省空間,你可以使用TINYINT型數(shù)據(jù)。同樣,這種類型的使用方法也與INT型相同,不同的是這種類型的字段只能存儲(chǔ)從到255的整數(shù)。TINYINT型字段不能用來存儲(chǔ)負(fù)數(shù)。 通常,為了節(jié)省空間,應(yīng)該盡可能的使用最小的整型數(shù)據(jù)。一個(gè)TINYINT型數(shù)據(jù)只占用一個(gè)字節(jié);一個(gè)INT型數(shù)據(jù)占用四個(gè)字節(jié)。這看起來似乎差別不大,但是在比較大的表中,字節(jié)數(shù)的增長(zhǎng)是很快的。另一方面,一旦你已經(jīng)創(chuàng)建了一個(gè)字段,要修改它是很困難的。因此,為安全起見,你應(yīng)該預(yù)測(cè)以下,一個(gè)字段所需要存儲(chǔ)的數(shù)值最大有可能是多大,然后選擇適當(dāng)?shù)臄?shù)據(jù)類型。 為了能對(duì)字段所存放的數(shù)據(jù)有更多的控制,你可以使用NUMERIC型數(shù)據(jù)來同時(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ù)類型的例子: CREATE TABLE numeric_data (bignumber NUMERIC(28,0), fraction NUMERIC (5,4) ) 當(dāng)這個(gè)語句執(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ù)來存儲(chǔ)錢數(shù)。但是,專門有另外兩種數(shù)據(jù)類型用于此目的。如果你希望你的網(wǎng)點(diǎn)能掙很多錢,你可以使用MONEY型數(shù)據(jù)。如果你的野心不大,你可以使用SMALLMONEY型數(shù)據(jù)。MONEY型數(shù)據(jù)可以存儲(chǔ)從-922,337,203,685,477.5808到922,337,203,685,477.5807的錢數(shù)。如果你需要存儲(chǔ)比這還大的金額,你可以使用NUMERIC型數(shù)據(jù)。 SMALLMONEY型數(shù)據(jù)只能存儲(chǔ)從-214,748.3648到214,748.3647 的錢數(shù)。同樣,如果可以的話,你應(yīng)該用SMALLMONEY型來代替MONEY型數(shù)據(jù),以節(jié)省空間。下面的例子顯示了如何使用這兩種表示錢的數(shù)據(jù)類型: CREATE TABLE products (product VARCHAR(40),price MONEY, Discount_price SMALLMONEY) 這個(gè)表可以用來存儲(chǔ)商品的折扣和普通售價(jià)。字段price 的數(shù)據(jù)類型是MONEY,字段discount_price的數(shù)據(jù)類型是SMALLMONEY。存儲(chǔ)邏輯值 如果你使用復(fù)選框(CHECKBOX)從網(wǎng)頁中搜集信息,你可以把
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西方國(guó)家政策協(xié)調(diào)的機(jī)制分析試題及答案
- 機(jī)電工程高新技術(shù)考察試題及答案
- 2025年直播電商主播影響力提升與內(nèi)容營(yíng)銷策略研究報(bào)告
- 反映西方社會(huì)變遷的重大政治事件試題及答案
- 公共政策在應(yīng)對(duì)自然災(zāi)害中的角色研究試題及答案
- 網(wǎng)絡(luò)設(shè)備性能評(píng)估試題及答案
- 接受失敗并調(diào)整學(xué)習(xí)方法2025年信息系統(tǒng)項(xiàng)目管理師試題及答案
- 西方國(guó)家的社會(huì)政策與民生福祉試題及答案
- 溝通技巧在公共政策中的應(yīng)用研究試題及答案
- 機(jī)電接口與通訊協(xié)議試題及答案
- 某村古建筑保護(hù)建設(shè)工程項(xiàng)目可行性方案
- 安全生產(chǎn)知識(shí)競(jìng)賽題庫及答案(共200題)
- 2023年中電信數(shù)智科技有限公司招聘筆試題庫及答案解析
- GB 1886.358-2022食品安全國(guó)家標(biāo)準(zhǔn)食品添加劑磷脂
- GB/T 1508-2002錳礦石全鐵含量的測(cè)定重鉻酸鉀滴定法和鄰菲啰啉分光光度法
- 小學(xué)六年級(jí)信息技術(shù)復(fù)習(xí)題
- 食品安全培訓(xùn)(食品安全知識(shí))-課件
- 初二物理新人教版《功》公開課一等獎(jiǎng)省優(yōu)質(zhì)課大賽獲獎(jiǎng)?wù)n件
- 北京大學(xué)國(guó)際政治經(jīng)濟(jì)學(xué)教學(xué)大綱
- 合肥市建設(shè)工程消防設(shè)計(jì)審查、消防驗(yàn)收、備案與抽查文書樣式
- 《電氣工程基礎(chǔ)》熊信銀-張步涵-華中科技大學(xué)習(xí)題答案全解
評(píng)論
0/150
提交評(píng)論