SQL數(shù)據(jù)操作基礎(chǔ)(初級(jí)) 4
發(fā)布時(shí)間:2008-09-17 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
用SQL創(chuàng)建新表
注意:
如果你還沒(méi)有建立自己的數(shù)據(jù)庫(kù),現(xiàn)在就跳回到第三章創(chuàng)建這個(gè)庫(kù)。你絕不能向master,tempdb或任何其他任何系統(tǒng)數(shù)據(jù)庫(kù)中添加數(shù)據(jù)。
從SQL Sever程序組(在任務(wù)欄中)中啟動(dòng)ISQL/w程序。出現(xiàn)查詢窗口后,從窗口頂部的下拉列表中選擇你在第三章所創(chuàng)建的數(shù)據(jù)庫(kù)。下一步,在查詢窗口中鍵入下面的SQL語(yǔ)句,單擊執(zhí)行查詢按鈕,執(zhí)行這個(gè)語(yǔ)句:
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è)表來(lái)存儲(chǔ)來(lái)字你站點(diǎn)訪問(wèn)者的信息。你是用REEATE TABLE語(yǔ)句創(chuàng)建的這個(gè)表,這個(gè)語(yǔ)句有兩部分:第一部份指定表的名子;第二部份是括在括號(hào)中的各字段的名稱(chēng)和屬性,相互之間用逗號(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è)專(zhuān)門(mén)的表達(dá)式。例如,字段名comments后面跟有表達(dá)式TEXT。這個(gè)表達(dá)式指定了字段的數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型決定了一個(gè)字段可以存儲(chǔ)什么樣的數(shù)據(jù)。因?yàn)樽侄蝐omments包含文本信息,其數(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ù)。例如,你可以把從HTML form的文本框中搜集到的信息放在字符型字段中。
要建立一個(gè)字段用來(lái)存放可變長(zhǎng)度的字符串信息,你可以使用表達(dá)式 VARCHAR??紤]你前面創(chuàng)建的表guestbook:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,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)?,只保留四十個(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)型的例子:
CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,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ù)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)存和硬盤(pá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ù)的例子:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,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)你從HTML form的多行文本編輯框(TEXTAREA)中收集數(shù)據(jù)時(shí),你應(yīng)該把收集的信息存儲(chǔ)于文本型字段中。但是,無(wú)論何時(shí),只要你能避免使用文本型字段,你就應(yīng)該不適用它。文本型字段既大且慢,濫用文本型字段會(huì)使服務(wù)器速度變慢。文本型字段還會(huì)吃掉大量的磁盤(pán)空間。
警告:
一旦你向文本型字段中輸入了任何數(shù)據(jù)(甚至是空值),就會(huì)有2K的空間被自動(dòng)分配給該數(shù)據(jù)。除非刪除該記錄,否則你無(wú)法收回這部分存儲(chǔ)空間。
數(shù)值型數(shù)據(jù)
SQL Sever支持許多種不同的數(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ù)的例子:
CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)
這個(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ǔ)從0到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)型。
為了能對(duì)字段所存放的數(shù)據(jù)有更多的控制,你可以使用NUMERIC型數(shù)據(jù)來(lái)同時(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ù)類(lèi)型的例子:
CREATE TABLE numeric_data (bignumber NUMERIC(28,0),
fraction NUMERIC (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ù)必須小于或等于整數(shù)部分的位數(shù),小數(shù)部分可以是零。
你可以使用INT型或NUMERIC型數(shù)據(jù)來(lái)存儲(chǔ)錢(qián)數(shù)。但是,專(zhuān)門(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)該用SMALLMONEY型來(lái)代替MONEY型數(shù)據(jù),以節(jié)省空間。下面的例子顯示了如何使用這兩種表示錢(qián)的數(shù)據(jù)類(lèi)型:
CREATE TABLE products (product VARCHAR(40),price MONEY,
Discount_price SMALLMONEY)
這個(gè)表可以用來(lái)存儲(chǔ)商品的折扣和普通售價(jià)。字段price 的數(shù)據(jù)類(lèi)型是MONEY,字段discount_price的數(shù)據(jù)類(lèi)型是SMALLMONEY。
存儲(chǔ)邏輯值
如果你使用復(fù)選框(CHECKBOX)從網(wǎng)頁(yè)中搜集信息,你可以把此信息存儲(chǔ)在BIT型字段中。BIT型字段只能取兩個(gè)值:0或1。這里有一個(gè)如何使用這種字段的例子:
CREATE TABLE opinion (visitor VARCHAR(40),good BIT)
這個(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型字段,你必須在創(chuàng)建表時(shí)完成。
存儲(chǔ)日期和時(shí)間
當(dāng)你建立一個(gè)網(wǎng)點(diǎn)時(shí),你也許需要記錄在一段時(shí)間內(nèi)的訪問(wèn)者數(shù)量。為了能夠存儲(chǔ)日期和時(shí)間,你需要使用DATETIME型數(shù)據(jù),如下例所示:
CREATE TABL visitorlog( visitor VARCHAR (40), arrivaltime DATETIME ,
departuretime DATETIME)
這個(gè)表可以用來(lái)記錄訪問(wèn)者進(jìn)入和離開(kāi)你網(wǎng)點(diǎn)的時(shí)間和日期。一個(gè)DATETIME型的字段可以存儲(chǔ)的日期范圍是從1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如果你不需要覆蓋這么大范圍的日期和時(shí)間,你可以使用SMALLDATETIME型數(shù)據(jù)。它與DATETIME型數(shù)據(jù)同樣使用,只不過(guò)它能表示的日期和時(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è)字段接受了空值后,如果你不改變它,它將一直保持空值??罩担∟ULL)和零是不同的,嚴(yán)格的說(shuō),空值表示沒(méi)有任何值。
為了允許一個(gè)字段接受空值,你要在字段定義的后面使用表達(dá)式NULL。例如,下面的表中兩個(gè)字段都允許接受空值:
CREATE TABLE empty (empty1 CHAR (40) NULL,empty2 INT NULL(
注意:
BIT型數(shù)據(jù)不能是空值。一個(gè)這種類(lèi)型的字段必須取0或者1。
有時(shí)你需要禁止一個(gè)字段使用空值。例如,假設(shè)有一個(gè)表存儲(chǔ)著信用卡號(hào)碼和信用卡有效日期,你不會(huì)希望有人輸入一個(gè)信用卡號(hào)碼但不輸入有效日期。為了強(qiáng)制兩個(gè)字段都輸入數(shù)據(jù),你可以用下面的方法建立這個(gè)表:
CREATE TABLE creditcards (creditcard_number CHAR(20) NOT NULL,
Creditcard_expire DATETIME NOT NULL)
注意字段定義的后面跟有表達(dá)式NOT NULL。通過(guò)包含表達(dá)式NOT NULL,你可以禁止任何人只在一個(gè)字段中插入數(shù)據(jù),而不輸入另一個(gè)字段的數(shù)據(jù)。
你將會(huì)發(fā)現(xiàn),在你建設(shè)自己的網(wǎng)點(diǎn)過(guò)程中,這種禁止空值的能力是非常有用的。如果你指定一個(gè)字段不能接受空值,那么當(dāng)你試圖輸入一個(gè)空值時(shí),會(huì)有錯(cuò)誤警告。這些錯(cuò)誤警告可以為程序調(diào)試提供有價(jià)值的線索。
缺省值
假設(shè)有一個(gè)存儲(chǔ)地址信息的表,這個(gè)表的字段包括街道、城市、州、郵政編碼和國(guó)家。如果你預(yù)計(jì)地址的大部分是在美國(guó),你可以把這個(gè)值作為country字段的缺省值。
為了在創(chuàng)建一個(gè)表時(shí)指定缺省值,你可以使用表達(dá)式DEFAULT。請(qǐng)看下面這個(gè)在創(chuàng)建表時(shí)使用缺省值的例子:
CREATE TABLE addresses (street VARCHAR(60) NULL,
city VARCHAR(40) NULL,
state VARCHAR(20) NULL
zip VARCHAR(20) NULL,
country VARCHAR(30) DEFAULT ‘USA’)
在這個(gè)例子中,字段country的缺省值被指定為美國(guó)。注意單引號(hào)的使用,引號(hào)指明這是字符型數(shù)據(jù)。為了給非字符型的字段指定缺省值,不要把該值擴(kuò)在引號(hào)中:
CREATE TABLE orders(price MONEY DEFAULT $38.00,
quantity INT DEFAULT 50,
entrydate DATETIME DEFAULT GETDATE())
在這個(gè)CREATE TABLE語(yǔ)句中,每個(gè)字段都指定了一個(gè)缺省值。注意DATETIME型字段entrydate所指定的缺省值,該缺省值是函數(shù)Getdate()的返回值,該函數(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_id job_desc
…………………………………………………………….
New Hire Job not specified
Chief Executive officer
Bushness Operations Manager
Chief Financial Officier
Publisher
字段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è)例子:
CREATE TABLE visitorID (theID NUBERIC(18) IDENTITY,name VARCHAR(40))
這個(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)型。例如你使用TINYINT型數(shù)據(jù),那么你只能向表中添加255個(gè)記錄。如果你預(yù)計(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)記錄根本不存在。