程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 操作數據SQL入門基礎

操作數據SQL入門基礎

編輯:關於SqlServer
本章內容

SQL介紹
使用SELECT 語句從表中取數據
創建新表
字段屬性
向表中添加數據
刪除和修改表


為了建立交互站點,你需要使用數據庫來存儲來自訪問者的信息。例如,你要建立一個職業介紹服務的站點,你就需要存儲諸如個人簡歷,所感興趣的工作等等這樣的信息。創建動態網葉也需要使用數據庫,如果你想顯示符合來訪者要求的最好的工作,你就需要從數據庫中取出這份工作的信息。你將會發現,在許多情況下需要使用數據庫。
在這一章裡,你將學會怎樣使用“結構化查詢語言”(SQL〕來操作數據庫。SQL語言是數據庫的標准語言。在Active Sever Pages 中,無論何時你要訪問一個數據庫,你就要使用SQL語言。因此,掌握好SQL對ASP編程是非常重要的。

注意:
你可以把“SQL”讀作“sequel”,也可以按單個字母的讀音讀作S-Q-L。 兩種發音都是正確的,每種發音各有大量的支持者。在本書裡,認為“SQL”讀作“sequel”。

通過這一章的學習,你將理解怎樣用SQL實現數據庫查詢,你將學會怎樣使用這種查詢從數據表中取出信息,最後,你將學會怎樣設計和建立自己的數據庫。

注意:
通過下面幾章對SQL的介紹,你將對SQL有足夠的了解,從而可以有效地使用Active Sever Pages。但是,SQL是一種復雜的語言,本書不可能包括它的全部細節。要全面掌握SQL語言,你需要學習在Microsoft SQL Sever 中使用SQL。你可以到附近的書店去買一本Microsoft SQL Sever 6.5。

SQL介紹:
本書假設你是在SQL操作Microsoft SQL Sever 的數據庫。你也可以用SQL操作許多其它類型的數據庫。SQL是操作數據庫的標准語言。(事實上,關於SQL語言有一個專門的ANSI標准〕

注意:
不要在你的站點上試圖用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同時服務於許多用戶,如果你希望你的站點有較高的訪問率,MS Access是不能勝任的。

在學習SQL的細節之前,你需要理解它的兩大特點。一個特點容易掌握,另一個掌握起來有點困難。
第一個特點是所有SQL數據庫中的數據都存儲在表中。一個表由行和列組成。例如,下面這個簡單的表包括name 和e-mail address:
Name Email Address
................................................................
Bill Gates [email protected]
president Clinton [email protected]
Stephen Walther [email protected]
這個表有兩列(列也稱為字段,域〕:Name和Email Address。有三行,每一行包含一組數據。一行中的數據組合在一起稱為一條記錄。
無論何時你向表中添加新數據,你就添加了一條新記錄。一個數據表可以有幾十個記錄,也可以有幾千甚至幾十億個記錄。雖然你也許永遠不需要存儲十億個Email地址,但知道你能這樣做總是好的,也許有一天你會有這樣的需要。
你的數據庫很有可能包含幾十個表,所有存儲在你數據庫中的信息都被存儲在這些表中。當你考慮怎樣把信息存儲在數據庫中時,你應該考慮怎樣把它們存儲在表中。
SQL的第二個特點有些難於掌握。這種語言被設計為不允許你按照某種特定的順序來取出記錄,因為這樣做會降低SQL Sever取記錄的效率。使用SQL,你只能按查詢條件來讀取記錄。
當考慮如何從表中取出記錄時,自然會想到按記錄的位置讀取它們。例如,也許你會嘗試通過一個循環,逐個記錄地掃描,來選出特定的記錄。在使用SQL時,你必須訓練自己,不要有這種思路。
假如你想選出所有的名字是“Bill Gates”的記錄,如果使用傳統的編程語言,你也許會構造一個循環,逐個查看表中的記錄,看名字域是否是“Bill Gates”。
這種選擇記錄的方法是可行的,但是效率不高。使用SQL,你只要說,“選擇所有名字域等於Bill Gates的記錄”,SQL就會為你選出所有符合條件的記錄。SQL會確定實現查詢的最佳方法。
建設你想取出表中的前十個記錄。使用傳統的編程語言,你可以做一個循環,取出前十個記錄後結束循環。但使用標准的SQL查詢,這是不可能實現的。從SQL的角度來說,在一個表中不存在前十個記錄這種概念。
開始時,當你知道你不能用SQL實現某些你感覺應該能實現的功能,你會受到挫折。你也許會以頭撞牆甚至想寫惡毒的信件給SQL的設計者們。但後來你會認識到,SQL的這個特點不僅不是個限制,反而是其長處。因為SQL不根據位置來讀取記錄,它讀取記錄可以很快。
綜上所述,SQL有兩個特點:所有數據存儲在表中,從SQL的角度來說,表中的記錄沒有順序。在下一節,你將學會怎樣用SQL從表中選擇特殊的記錄。

使用SQL從表中取記錄。
SQL的主要功能之一是實現數據庫查詢。

如果你熟悉Internet 引擎,那麼你已經熟悉查詢了。你使用查詢來取得滿足特定條件的信息。例如,如果你想找到有ASP信息的全部站點,你可以連接到 Yahoo!並執行一個對Active Sever Pages的搜索。在你輸入這個查詢後,你會收到一個列表,表中包括所有其描述中包含搜索表達式的站點。
多數Internet 引擎允許邏輯查詢。在邏輯查詢中,你可以包括特殊的運算符如AND、OR和NOT,你使用這些運算符來選擇特定的記錄。例如,你可以用AND來限制查詢結果。如果你執行一個對Active Sever Pages AND SQL的搜索。你將得到其描述中同時包含Active Sever Pages 和SQL的記錄。當你需要限制查詢結果時,你可以使用AND。
如果你需要擴展查詢的結果,你可以使用邏輯操作符OR。例如,如果你執行一個搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站點,你收到的列表中將包括所有其描述中同時包含兩個表達式或其中任何一個表達式的站點。
如果你想從搜索結果中排除特定的站點,你可以使用NOT。例如,查詢“Active Sever Pages ”AND NOT “SQL”將返回一個列表,列表中的站點包含Active Sever Pages,但不包含SQL。當必須排除特定的記錄時,你可以使用NOT。
用SQL執行的查詢與用Internet搜索引擎執行的搜索非常相似。 當你執行一個SQL查詢時,通過使用包括邏輯運算符的查詢條件,你可以得到一個記錄列表。此時查詢結果是來自一個或多個表。
SQL查詢的句法非常簡單。假設有一個名為email_table 的表,包含名字和地址兩個字段,要得到Bill Gates 的e_mail地址,你可以使用下面的查詢:

SELECT email from email_table WHERE name="Bill Gates"

當這個查詢執行時,就從名為email_table的表中讀取Bill Gates的e_mail 地址。這個簡單的語句包括三部分:
■ SELECT語句的第一部分指名要選取的列。在此例中,只有email列被選取。當執行 時,只顯示email列的值 [email protected]
■ SELECTT語句的第二部份指明要從哪個(些)表中查詢數據。在此例中,要查詢的表名為email_table 。
■ 最後,SELECT語句的WHERE子句指明要選擇滿足什麼條件的記錄。在此例中,查詢條件為只有name列的值為Bill Gates 的記錄才被選取。
Bill Gates很有可能擁有不止一個email地址。如果表中包含Bill Gates的多個email地址。用上述的SELECT語句可以讀取他所有的email地址。SELECT語句從表中取出所有name字段值為Bill Gates 的記錄的email 字段的值。
前面說過,查詢可以在查詢條件中包含邏輯運算符。假如你想讀取Bill Gates 或Clinton總統的所有email地址,你可以使用下面的查詢語句:

SELECT email FROM email_table WHERE name="Bill Gates" OR
name="president Clinton"

此例中的查詢條件比前一個復雜了一點。這個語句從表email_table中選出所有name列為Bill Gates或president Clinton的記錄。如果表中含有Bill Gates或president Clinton的多個地址,所有的地址都被讀取。
SELECT語句的結構看起來很直觀。如果你請一個朋友從一個表中為你選擇一組記錄,你也許以非常相似的方式提出你的要求。在SQL SELECT語句中,你“SELECT


您正在看的SQLserver教程是:操作數據SQL入門基礎。特定的列FROM一個表WHERE某些列滿足一個特定的條件”。
下一節將介紹怎樣執行SQL查詢來選取記錄。這將幫助你熟悉用SELECT語句從表中取數據的各種不同方法。

使用ISQL執行SELECT查詢
當你安裝SQL Sever時,你同時安裝了一個叫作ISQL/w的應用程序。ISQL/w允許你執行交互的SQL查詢。在把查詢包括到你的ASP網頁中之前,用ISQL/w對其進行測試是非常有用的。

注意:
在這本書的第一部份,你學習了怎樣安裝和配置Microsoft SQL Sever 。如果沒有安裝SQL Sever或者SQL Sever不能運行,請參閱第三章“安裝和使用SQL Sever”。

選擇任務上SQL Sever程序組中的ISQL_w以啟動該程序。程序啟動時,首先會出現一個對話框,要求輸入服務器信息和登錄信息(見圖10.1)。在Sever框中,輸入你的SQL服務器的名字。如果服務器正運行在本地計算機上,服務器名字就是你計算機的名字。在登錄信息框中,輸入一個登錄帳號和密碼或選擇使用“可信連接”,然後單擊Connect按鈕。

圖10。1



注意:
如果你將SQL Sever配置為使用完整安全或混合安全,那麼你可以使用可信連接。如果你使用標准安全,你則需要提供用戶帳號和密碼。要了解更多信息,參見第三章。



如果一切正常,在你單擊連接按鈕後會出現一個查詢窗口,如圖10.2所示。(如果有異常,請參考第三章)


圖10.2


在執行查詢之前,你需要選擇數據庫。安裝 SQL Sever時你已為自己創建了一個數據庫,SQL Sever還有許多系統數據庫,如master,model,msdb,和tempdb。
方便的是,SQL Sever帶有一個特殊的名為pubs的例子數據庫。庫 pubs中包含供一個虛擬的出版商使用的各個表。文檔中所有的例子程序都是針對這個庫來設計的。本書中的許多例子也使用這個數據庫。
在查詢窗口頂部的DB下拉框中選擇數據庫pubs,這樣你就選擇了數據庫。你所有的查詢都將針對這個庫中的各個表來執行。現在你可以執行你的第一個查詢了。這真讓人興奮!
你的第一個查詢將針對一個名為autrors的表,表中包含所有為某個虛擬出版商工作的作者的相關數據。單擊查詢窗口並輸入以下的語句:

SELECT phone FROM authors WHERE au_name="Ringer"

輸入完成後,單擊執行查詢按鈕(一個綠色三角形,看起來像VCR播放鍵)。單擊此按鈕後,任何出現在查詢窗口中的語句均會被執行。查詢窗口會自動變成結果顯示窗口,你可以看到查詢的結果(見圖10.3)。
你看到的查詢結果也許與圖10.3所示的不同。在SQL Sever的不同版本中,庫pubs中的數據會有所不同。對SQL Sever 6.5來說,將會找到兩條記錄。結果顯示窗口中應顯示如下內容:

phone
……………….
801 826_0752
801 826_0752
(2 row(s) affected)



圖10.3



你所執行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號碼。你通過在WHERE子句中使用特殊的選擇條件來限制查詢的結果。你也可以忽略選擇條件,從表中取出所有作者的電話號碼。要做到這一點,單擊Query標簽,返回到查詢窗口,輸入以下的SELECT語句:

SELECT Phone

FROM authors
這個查詢執行後,會取出表authors中的所有電話號碼(沒有特定的順序)。如果表authors中包含一百個電話號碼,會有一百個記錄被取出,如果表中有十億個電話號碼,這十億條記錄都會被取出(這也許需要一些時間)。
表authrs的字段包括姓,名字,電話號碼,地址,城市,州和郵政編碼。通過在SELECT語句的第一部份指定它們,你可以從表中取出任何一個字段。你可以在一個SELECT語句中一次取出多個字段,比如:

SELECT au_fname ,au_lname, phone FROM authors

這個SELECT語句執行後,將取出這三個列的所有值。下面是這個查詢的結果的一個示例(為了節省紙張,只顯示查詢結果的一部分,其余記錄用省略號代替):

au_fname au_lname phone
………………………………………………………………………….
Johnson White 408 496_7223
MarjorIE Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O’Leary 408 286_2428

(23 row(s) affected)

在SELECT語句中,你需要列出多少個字段,你就可以列出多少。不要忘了把字段名用逗號隔開。你也可以用星號(*)從一個表中取出所有的字段。這裡有一個使用星號的例子:

SELECT * FROM authors

這個SELECT語句執行後,表中的所有字段的值都被取出。你會發現你將在SQL查詢中頻繁使用星號。

技巧:
你可以使用星號來查看一個表的所有列的名字。要做到這一點,只需要在執行完SELECT語句後看一下查詢結果的列標題。

操作多個表
到現在為止,你只嘗試了用一句SQL查詢從一個表中取出數據。你也可以用一個SELECT語句同時從多個表中取出數據,只需在SELECT語句的FROM從句中列出要從中取出數據的表名稱即可:

SELECT au_lname ,title FROM authors, titles

這個SELECT語句執行時,同時從表authors和表titles中取出數據。從表authors中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執行這個查詢,看一下查詢結果。你會發現一些奇怪的出乎意料的情況:作者的名字並沒有和它們所著的書相匹配,而是出現了作者名字和書名的所有可能的組合,這也許不是你所希望見到的。
出了什麼差錯?問題在於你沒有指明這兩個表之間的關系。你沒有通過任何方式告訴SQL如何把表和表關聯在一起。由於不知道如何關聯兩個表,服務器只能簡單地返回取自兩個表中的記錄的所有可能組合。
要從兩個表中選出有意義的記錄組合,你需要通過建立兩表中字段的關系來關聯兩個表。

要做到這一點的途徑之一是創建第三個表,專門用來描述另外兩個表的字段之間的關系。
表authors有一個名為au_id的字段,包含有每個作者的唯一標識。表titles有一個名為title_id的字段,包含每個書名的唯一標識。如果你能在字段au_id和字段title_id 之間建立一個關系,你就可以關聯這兩個表。數據庫pubs中有一個名為titleauthor的表,正是用來完成這個工作。表中的每個記錄包括兩個字段,用來把表titles和表authors關聯在一起。下面的SELECT語句使用了這三個表以得到正確的結果:

SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id

當這個SELECT語句執行時,每個作者都將與正確的書名相匹配。表titleauthor指明了表authors和表titles的關系,它通過包含分別來自兩個表的各一個字段實現這一點。第三個表的唯一目的是在另外兩個表的字段之間建立關系。它本身不包含任何附加數據。
注意在這個例子中字段名是如何書寫的。為了區別表authors和表titles中相同的字段名au_id,每個字段名前面都加上了表名前綴和一個句號。名為author.au_id 的字段屬於表authors,名為titleauthor.au_id的字段屬於表titleauthor,兩者不會混淆。
通過使用第三個表,你可以在兩個表的字段之間建立各種類型的關系。例如,一個作者也許寫了許多不同的書,或者一本書也許由許多不同的作者共同完成。當兩個表的字段之間有這種“多對多”的關系時,你需要使用第三個表來指明這種關系。
但是,在許多情況下,兩個表之間的關系並不復雜。比如你需要指明表titles和表publishers之間的關系。因為一個書名不可能與多個出版商相匹配,你不需要通過第三個表來指明這兩個表之間的關系。要指明表titles和表publishers之間的關系,你只要讓這兩個表有一個公共的字段就可以了。在數據庫pubs中,表titles和表publishers都有一個名為pub_id的字段。如果你想得到書名及其出版商的一個列表,你可以使用如下的語句:
SELECT title,pub_name FRO


您正在看的SQLserver教程是:操作數據SQL入門基礎。M titles,publishers
WHERE titles.pub_id=publishers.pub_id

當然,如果一本書是由兩個出版商聯合出版的,那麼你需要第三個表來代表這種關系。
通常,當你予先知道兩個表的字段間存在“多對多”關系時,就使用第三個表來關聯這兩個表。反之,如果兩個表的字段間只有“一對一”或“一對多”關系,你可以使用公共字段來關聯它門。

操作字段
通常,當你從一個表中取出字段值時,該值與創建該表時所定義的字段名聯系在一起。如果你從表authors中選擇所有的作者名字,所有的值將會與字段名au_lname相聯系。但是在某些情況下,你需要對字段名進行操作。在SELECT語句中,你可以在缺省字段名後面僅跟一個新名字來取代它。例如,可以用一個更直觀易讀的名字Author Last Name來代替字段名au_lname:

SELECT au_lname "Author Last Name" FROM authors

當這個SELECT語句執行時,來自字段au_lname的值會與“Author Last Name”相聯系。查詢結果可能是這樣:

Author Last Name
……………………………………………………………………..
White
Green
Carson
O’Leary
Straight

(23 row(s) affected)

注意字段標題不再是au_lname,而是被Author Last Name所取代。
你也可以通過執行運算,來操作從一個表返回的字段值。例如,如果你想把表titles中的所有書的價格加倍,你可以使用下面的SELECT語句:

SELECT price*2 FROM titles

當這個查詢執行時,每本書的價格從表中取出時都會加倍。但是,通過這種途徑操作字段不會改變存儲在表中的書價。對字段的運算只會影響SELECT語句的輸出,而不會影響表中的數據。為了同時顯示書的原始價格和漲價後的新價格,你可以使用下面的查詢:

SELECT price "Original price", price*2 "New price" FROM titles

當數據從表titles中取出時,原始價格顯示在標題Original price下面,加倍後的價格顯示在標題New price下面。結果可能是這樣:

original price new price
……………………………………………………………….
19.99 39.98

r>11.95 23.90
2.99 5.98
19.99 39.98

(18 row(s) affected)

你可以使用大多數標准的數學運算符來操作字段值,如加(+),減(-),乘(*)和除(/)。你也可以一次對多個字段進行運算,例如:

SELECT price*ytd_sales "total revenue" FROM titles

在這個例子中,通過把價格與銷售量相乘,計算出了每種書的總銷售額。這個SELECT語句的結果將是這樣的:

total revenue
……………………………………………..
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68

(18 row(s) affected)

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

SELECT au_fname+" "+au_lname "author name" FROM authors

在這個例子中,你把字段au_fname和字段au_lname粘貼在一起,中間用一個逗號 隔開,並把查詢結果的標題指定為author name。這個語句的執行結果將是這樣的:

author names
…………………………………………………………
Johnson White
MarjorIE Green
Cheryl Carson
Michael O’Leary
Dean Straight

(23 row(s) affected)

可以看到,SQL為你提供了對查詢結果的許多控制。你應該在ASP編程過程中充分利用這些優點。使用SQL來操作查詢結果幾乎總是比使用有同樣作用的腳本效率更高。

排序查詢結果
本章的介紹中曾強調過,SQL表沒有內在的順序。例如,從一個表中取第二個記錄是沒有意義的。從SQL的角度看來,沒有一個記錄在任何其他記錄之前。
然而,你可以操縱一個SQL查詢結果的順序。在缺省情況下,當記錄從表中取出時,記錄不以特定的順序出現。例如,當從表authors中取出字段au_lname時,查詢結果顯示成這樣:

au_lname
…………………………………….
White
Green
Carson
O’Leary
Straight

(23 row(s) affected)

看一列沒有特定順序的名字是很不方便的。如果把這些名字按字母順序排列,讀起來就會容易得多。通過使用ORDER BY子句,你可以強制一個查詢結果按升序排列,就像這樣:

SELECT au_lname FROM authors ORDER BY au_lname

當這個SELECT語句執行時,作者名字的顯示將按字母順序排列。ORDER BY子句將作者名字按升序排列。
你也可以同時對多個列使用ORDER BY子句。例如,如果你想同時按升序顯示字段au_lname和字段au_fname,你需要對兩個字段都進行排序:

SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname

這個查詢首先把結果按au_lname字段進行排序,然後按字段au_fname排序。記錄將按如下的順序取出:

au_lname au_fname
…………………………………………………………………….
Bennet Abraham
Ringer Albert
Ringer Anne
Smith Meander

(23 row(s) affected)

注意有兩個作者有相同的名字Ringer。名為Albert Ringer的作者出現名為Anne Ringer的作者之前,這是因為姓Albert按字母順序應排在姓Anne之前。
如果你想把查詢結果按相反的順序排列,你可以使用關鍵字DESC。關鍵字DESC把查詢結果按降序排列,如下例所示:

SELECT au_lname,au_fname FROM authors
WHERE au_lname=”Ringer” ORDER BY au_lname ,au_fname DESC

>
這個查詢從表authors中取出所有名字為Ringer的作者記錄。ORDER BY子句根據作者的名字和姓,將查詢結果按降序排列。結果是這樣的:

au_lname au_fname
……………………………………………………………………………………….
Ringer Anne
Ringer Albert
(2 row(s) affectec)

注意在這個表中,姓Anne出現在姓Albert之前。作者名字按降序顯示。
你也可以按數值型字段對一個查詢結果進行排序。

例如,如果你想按降序取出所有書的價格,你可以使用如下的SQL查詢:

SELECT price FROM titles ORDER BY price DESC

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

警告:
不是特別需要時,不要對查詢結果進行排序,因為服務器完成這項工作要費些力氣。這意味著帶有ORDER BY 子句的SELECT語句執行起來比一般的SELECT語句花的時間長。

取出互不相同的記錄
一個表有可能在同一列中有重復的值。例如,數據庫pubs的表authors中有兩個作者的名字是Ringer。如果你從這個表中取出所有的名字,名字Ringer將會顯示兩次。
在特定情況下,你可能只有興趣從一個表中取出互不相同的值。如果一個字段有重復的值,你也許希望每個值只被選取一次,你可以使用關鍵字DISTINCT來做到這一點:

SELCET D


您正在看的SQLserver教程是:操作數據SQL入門基礎。ISTINCT au_lname FROM authors WHERE au_lname="Ringer"

當這個SELECT語句執行時,只返回一個記錄。通過在SELECT語句中包含關鍵字DISTINCT,你可以刪除所有重復的值。例如,假設有一個關於新聞組信息發布的表,你想取出所有曾在這個新聞組中發布信息的人的名字,那麼你可以使用關鍵字DISTINCT。每個用戶的名字只取一次——盡管有的用戶發布了不止一篇信息。
警告:
如同ORDER BY子句一樣,強制服務器返回互不相同的值也會增加運行開銷。福氣不得不花費一些時間來完成這項工作。因此,不是必須的時候不要使用關鍵字DISTINCT。

創建新表
前面說過,數據庫中的所有數據存儲在表中。數據表包括行和列。列決定了表中數據的類型。行包含了實際的數據。
例如,數據庫pubs中的表authors有九個字段。其中的一個字段名為為au_lname,這個字段被用來存儲作者的名字信息。每次向這個表中添加新作者時,作者名字就被添加到這個字段,產生一條新記錄。
通過定義字段,你可以創建一個新表。每個字段有一個名字和一個特定的數據類型(數據類型在後面的“字段類型”一節中講述),例如字段au_lname存儲的是字符型數據。一個字段也可以存儲其它類型的數據。
使用SQL Sever,創建一個新表的方法是很多的。你可以可執行一個SQL語句或使用SQL事務管理器(SQL Enterprise Manager)來創建一個新表。在下一節裡,你將學會如何用SQL語句來創建一個新表。

用SQL創建新表
注意:
如果你還沒有建立自己的數據庫,現在就跳回到第三章創建這個庫。你絕不能向master,tempdb或任何其他任何系統數據庫中添加數據。

從SQL Sever程序組(在任務欄中)中啟動ISQL/w程序。出現查詢窗口後,從窗口頂部的下拉列表中選擇你在第三章所創建的數據庫。下一步,在查詢窗口中鍵入下面的SQL語句,單擊執行查詢按鈕,執行這個語句:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate
DATETIME)

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

This command dit not return data ,and it did not return any rows

祝賀你,你已經建立了你的第一個表!
你所創建的表名為guestbook,你可以使用這個表來存儲來字你站點訪問者的信息。你是用REEATE TABLE語句創建的這個表,這個語句有兩部分:第一部份指定表的名子;第二部份是括在括號中的各字段的名稱和屬性,相互之間用逗號隔開。
表guestbook有三個字段:visitor,comments 和entrydate。visitor字段存儲訪問者的名字,comments字段存儲訪問者對你站點的意見,entrydate字段存儲訪問者訪問你站點的日期和時間。
注意每個字段名後面都跟有一個專門的表達式。例如,字段名comments後面跟有表達式TEXT。這個表達式指定了字段的數據類型。數據類型決定了一個字段可以存儲什麼樣的數據。因為字段comments包含文本信息,其數據類型定義為文本型。
字段有許多不同的數據類型。下一小節講述SQL所支持的一些重要的數據類型。

字段類型
不同的字段類型用來存放不同類型的數據。創建和使用表時,更你應該理解五種常用的字段類型:字符型,文本型,數值型,邏輯性和日期型。

字符型數據
字符型數據非常有用。當你需要存儲短的字符串信息時,你總是要用到字符型數據。例如,你可以把從Html form的文本框中搜集到的信息放在字符型字段中。
要建立一個字段用來存放可變長度的字符串信息,你可以使用表達式 VARCHAR。考慮你前面創建的表guestbook:

CREATE TABLE guestbook (visitor VARCHAR(40),

comments TEXT,entrydate
DATETIME)

在這個例子中,字段visitor的數據類型為VARCHAR。注意跟在數據類型後面的括號中的數字。這個數字指定了這個字段所允許存放的字符串的最大長度。在這個例子中,字段visitor能存放的字符串最長為四十個字符。如果名字太長,字符串會被截斷,只保留四十個字符。
VARCHAR類型可以存儲的字符串最長為255個字符。要存儲更長的字符串數據,可以使用文本型數據(下一節中講述)。
另一種字符型數據用來存儲固定長度的字符數據。下面是一個使用這種數據類型的例子:

CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate
DATETIME)

在這個例子中,字段visitor被用來存儲四十個字符的固定長度字符串。表達式CHAR指定了這個字段應該是固定長度的字符串。
VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。假如你向一個長度為四十個字符的VARCHAR型字段中輸入數據Bill Gates。當你以後從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串Bill Gates的長度。
現在假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那麼當你取出數據時,所取出的數據長度將是四十個字符。字符串的後面會被附加多余的空格。
當你建立自己的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數據中多余的空格而操心。
VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要。

文本型數據
字符型數據限制了字符串的長度不能超過255個字符。而使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。
這裡有一個使用文本型數據的例子:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate
DATETIME)

在這個例子中,字段comments被用來存放訪問者對你站點的意見。注意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要麼為空,要麼很大。
當你從Html form的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型字段中。但是,無論何時,只要你能避免使用文本型字段,你就應該不適用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間。
警告:
一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。

數值型數據
SQL Sever支持許多種不同的數值型數據。你可以存儲整數、小數、和錢數。
通常,當你需要在表中的存放數字時,你要使用整型(INT)數據。INT型數據的表數范圍是從-2,147,483,647到2,147,483,647的整數。下面是一個如何使用INT型數據的例子:

CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)

這個表可以用來記錄你站點被訪問的次數。只要沒有人訪問你的站點超過2,147,483,647次,nubvisits字段就可以存儲訪問次數。
為了節省內存空間,你可以使用SMALLINT型數據。SMALLINT 型數據可以存儲從-32768到32768的整數。這種數據類型的使用方法與INT型完全相同。
最後,如果你實在需要節省空間,你可以使用TINYINT型數據。同樣,這種類型的使用方法也與INT型相同,不同的是這種類型的字段只能存儲從0到255的整數。TINYINT型字段不能用來存儲負數。
通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只占用一個字節;一個INT型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很困難的。因此,為安全起見,你應該預測以下,一個字段所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。
為了能對字段所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型字段可以存儲從-1038到1038范圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型字段中存儲小數3.14


您正在看的SQLserver教程是:操作數據SQL入門基礎。。
當定義一個NUMERIC型字段時,你需要同時指定整數部分的大小和小數部分的大小。這裡有一個使用這種數據類型的例子:

CREATE TABLE numeric_data (bignumber NUMERIC(28,0),


fraction NUMERIC (5,4) )

當這個語句執行時,將創建一個名為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 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間。下面的例子顯示了如何使用這兩種表示錢的數據類型:

CREATE TABLE products (product VARCHAR(40),price M

ONEY,
Discount_price SMALLMONEY)

這個表可以用來存儲商品的折扣和普通售價。字段price 的數據類型是MONEY,字段discount_price的數據類型是SMALLMONEY。

存儲邏輯值
如果你使用復選框(CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:0或1。這裡有一個如何使用這種字段的例子:

CREATE TABLE opinion (visitor VARCHAR(40),good BIT)

這個表可以用來存放對你的網點進行民意調查所得的信息。訪問者可以投票表示他們是否喜歡你的網點。如果他們投YES,就在BIT型字段中存入1。反之,如果他們投NO,就在字段中存入0(在下一章裡,你將學會如何計算投票)。
當心,在你創建好一個表之後,你不能向表中添加BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創建表時完成。

存儲日期和時間
當你建立一個網點時,你也許需要記錄在一段時間內的訪問者數量。為了能夠存儲日期和時間,你需要使用DATETIME型數據,如下例所示:

CREATE TABL visitorlog( visitor VARCHAR (40), arrivaltime DATETIME ,
departuretime DATETIME)

這個表可以用來記錄訪問者進入和離開你網點的時間和日期。一個DATETIME型的字段可以存儲的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最後一毫秒。
如果你不需要覆蓋這麼大范圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間范圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從1900年1月1日到2079年6月6日的日期,它只能精確到秒。
DATETIME型字段在你輸入日期和時間之前並不包含實際的數據,認識這一點是重要的。在下一章,你將學習怎樣使用大量的SQL函數來讀取和操作日期和時間(參見下面的“缺省值”一節)。你也可以在VBScript和JScript 中使用日期和時間函數來向一個DATETIME型字段中輸入日期和時間。

字段屬性
上一節介紹了如何建立包含不同類型字段的表。在這一節中,你將學會如何使用字段的三個屬性。這些屬性允許你控制空值,缺省值和標識值。

允許和禁止空值
大多數字段可以接受空值(NULL)。當一個字段接受了空值後,如果你不改變它,它將一直保持空值。空值(NULL)和零是不同的,嚴格的說,空值表示沒有任何值。
為了允許一個字段接受空值,你要在字段定義的後面使用表達式NULL。例如,下面的表中兩個字段都允許接受空值:

CREATE TABLE empty (empty1 CHAR (40) NULL,empty2 INT NULL(

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

有時你需要禁止一個字段使用空值。例如,假設有一個表存儲著信用卡號碼和信用卡有效日期,你不會希望有人輸入一個信用卡號碼但不輸入有效日期。為了強制兩個字段都輸入數據,你可以用下面的方法建立這個表:

CREATE TABLE creditcards (creditcard_number CHAR(20) NOT NULL,
Creditcard_expire DATETIME NOT NULL)
注意字段定義的後面跟有表達式NOT NULL。通過包含表達式NOT NULL,你可以禁止任何人只在一個字段中插入數據,而不輸入另一個字段的數據。
你將會發現,在你建設自己的網點過程中,這種禁止空值的能力是非常有用的。

如果你指定一個字段不能接受空值,那麼當你試圖輸入一個空值時,會有錯誤警告。這些錯誤警告可以為程序調試提供有價值的線索。

缺省值
假設有一個存儲地址信息的表,這個表的字段包括街道、城市、州、郵政編碼和國家。如果你預計地址的大部分是在美國,你可以把這個值作為country字段的缺省值。
為了在創建一個表時指定缺省值,你可以使用表達式DEFAULT。請看下面這個在創建表時使用缺省值的例子:

CREATE TABLE addresses (street VARCHAR(60) NULL,
city VARCHAR(40) NULL,
state VARCHAR(20) NULL
zip VARCHAR(20) NULL,
country VARCHAR(30) DEFAULT ‘USA’)

在這個例子中,字段country的缺省值被指定為美國。注意單引號的使用,引號指明這是字符型數據。為了給非字符型的字段指定缺省值,不要把該值擴在引號中:

CREATE TABLE orders(price MONEY DEFAULT $38.00,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved