第3章數(shù)據(jù)表及其應(yīng)用_第1頁(yè)
第3章數(shù)據(jù)表及其應(yīng)用_第2頁(yè)
第3章數(shù)據(jù)表及其應(yīng)用_第3頁(yè)
第3章數(shù)據(jù)表及其應(yīng)用_第4頁(yè)
第3章數(shù)據(jù)表及其應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章SQL中的表及其應(yīng)用3.1表的基礎(chǔ)知識(shí)3.2表的創(chuàng)建3.3表的操作3.4數(shù)據(jù)完整性控制第3章SQL中的表及其應(yīng)用教學(xué)重點(diǎn):(1)T-SQL的數(shù)據(jù)類型(2)使用對(duì)象資源管理器實(shí)現(xiàn)表的創(chuàng)建和操作(3)使用T-SQL語(yǔ)言實(shí)現(xiàn)表的創(chuàng)建和操作3.1表的基礎(chǔ)知識(shí)3.1.1表的定義3.1.2數(shù)據(jù)類型3.1.3約束3.1.1表的定義表是一系列行和列的集合。在表中,數(shù)據(jù)成二維行列格式,每一行代表一個(gè)惟一的記錄,每一列代表一個(gè)域。1.表的概念(1)關(guān)系數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)存儲(chǔ)在表對(duì)象中,表是數(shù)據(jù)庫(kù)中最重要的對(duì)象,每個(gè)表代表著一個(gè)實(shí)體集或?qū)嶓w集之間的聯(lián)系。(2)創(chuàng)建一個(gè)表最有效的方法是將表中所需的信息一次定義完成,包括數(shù)據(jù)約束和附加成份。也可以先創(chuàng)建一個(gè)基礎(chǔ)表,向其中添加一些數(shù)據(jù)并使用一段時(shí)間,再根據(jù)應(yīng)用情況定義其它成份。(3)在SQLServer中創(chuàng)建表有如下限制:①每個(gè)數(shù)據(jù)庫(kù)里最多有20億個(gè)表;每個(gè)表最多可以包含1024個(gè)字段;每條記錄最多可以占用8060字節(jié),但不包括text字段和image字段。②每個(gè)表上最多可以創(chuàng)建一個(gè)聚集索引和249個(gè)非聚集索引;2.創(chuàng)建表的步驟(1)定義表結(jié)構(gòu):確定表的各字段的名稱,并為每個(gè)字段確定數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度、是否可以為空等。(2)設(shè)置約束:設(shè)置約束是為了限制字段輸入值的取值范圍,以保證數(shù)據(jù)的完整性。(3)添加數(shù)據(jù):表結(jié)構(gòu)建立完成之后,就可以向表中輸入數(shù)據(jù)了。

3.1.2T-SQL的數(shù)據(jù)類型

數(shù)據(jù)類型是指數(shù)據(jù)所代表信息的類型,是數(shù)值型、字符型、日期型,還是貨幣型、圖像型等其它的類型數(shù)據(jù),它關(guān)系到SQLServer2005系統(tǒng)在內(nèi)存或磁盤上開辟相應(yīng)的存儲(chǔ)空間。定義表的各字段時(shí)必須說(shuō)明該字段的數(shù)據(jù)類型,數(shù)據(jù)類型定義了該字段可接受的數(shù)據(jù)值及其占用的內(nèi)存空間,同時(shí)也決定訪問(wèn)、顯示、更新數(shù)據(jù)的方法。T-SQL的數(shù)據(jù)類型包括系統(tǒng)數(shù)據(jù)類型及用戶自定義的數(shù)據(jù)類型兩大類SQLServer的九種數(shù)據(jù)類型

1)整型數(shù)據(jù)類型(Integer)2)精確數(shù)字?jǐn)?shù)據(jù)類型(ExactNumeric)3)近似數(shù)字?jǐn)?shù)據(jù)類型(ApproximateNumeric)4)貨幣數(shù)據(jù)類型(Money)5)日期和時(shí)間數(shù)據(jù)類型(DateTime)6)字符數(shù)據(jù)類型(Character)7)二進(jìn)制數(shù)據(jù)類型8)特殊數(shù)據(jù)類型9)自定義數(shù)據(jù)類型(UDT)字符型數(shù)據(jù)類型主要用來(lái)存儲(chǔ)由字母、數(shù)字和符號(hào)組成的字符串。SQLServer提供了三種字符型數(shù)據(jù)類型:

char、varchar和text。char用于存儲(chǔ)長(zhǎng)度固定的字符串;varchar用于存儲(chǔ)長(zhǎng)度可變的字符串;text用于存儲(chǔ)無(wú)限長(zhǎng)的字符串(每行可達(dá)2GB)。系統(tǒng)數(shù)據(jù)類型--字符型系統(tǒng)數(shù)據(jù)類型--字符型

字符型對(duì)每個(gè)字符都使用一個(gè)字節(jié)進(jìn)行存儲(chǔ):

char[(n)],n的取值為1~8000,固定長(zhǎng)度的字符串,長(zhǎng)度從1到8000,如果省略了長(zhǎng)度,則缺省值為1。存儲(chǔ)字節(jié)數(shù)為N字節(jié),若實(shí)際輸入的字符個(gè)數(shù)不足N個(gè),在輸入的數(shù)據(jù)后面填充空格補(bǔ)足到N個(gè)

varchar[(n)],n的取值為1~8000??勺冮L(zhǎng)度的字符串,最大長(zhǎng)度從1到8000,如果省略了長(zhǎng)度,則缺省值為1。存儲(chǔ)字節(jié)數(shù)為輸入的實(shí)際字符長(zhǎng)度,不會(huì)填充額外的空格。系統(tǒng)數(shù)據(jù)類型--字符型

text數(shù)據(jù)類型用于存儲(chǔ)數(shù)據(jù)量龐大且變長(zhǎng)的字符文本數(shù)據(jù),如簡(jiǎn)歷信息等。最多達(dá)到2GB,行中存儲(chǔ)指向第一個(gè)數(shù)據(jù)頁(yè)的指針,實(shí)際文本以b-樹數(shù)據(jù)頁(yè)來(lái)存儲(chǔ)。不能使用”=”運(yùn)算,也不能使用很多系統(tǒng)函數(shù)。Varchar(Max):SQLServer2005引入代替text數(shù)據(jù)類型,最多可存儲(chǔ)2GB數(shù)據(jù),對(duì)使用Varchar(Max)數(shù)據(jù)類型的操作或函數(shù)沒(méi)有限制二進(jìn)制型是指數(shù)據(jù)是由二進(jìn)制值組成,如程序代碼或圖像數(shù)據(jù)。SQLServer提供了三種二進(jìn)制數(shù)據(jù)類型:binary、varbinary和image:

binary用于存儲(chǔ)長(zhǎng)度固定的二進(jìn)制字符串;

varbinary用于存儲(chǔ)長(zhǎng)度可變的二進(jìn)制字符串;

image用于存儲(chǔ)大的字符串。系統(tǒng)數(shù)據(jù)類型--二進(jìn)制型系統(tǒng)數(shù)據(jù)類型--二進(jìn)制binary型數(shù)據(jù)類似于字符型數(shù)據(jù),當(dāng)實(shí)際的二進(jìn)制數(shù)據(jù)長(zhǎng)度小于定義長(zhǎng)度時(shí),binary類型會(huì)在實(shí)際數(shù)據(jù)的尾部添加二進(jìn)制的0,而不是空格。image型數(shù)據(jù)的存儲(chǔ)長(zhǎng)度為0~231-1個(gè)字節(jié),可以用來(lái)存儲(chǔ)照片、圖片或者圖畫。SQLServer支持兩種日期時(shí)間數(shù)據(jù)類型:

datetime和smalldatetime:datetime類型用于存儲(chǔ)從1753年1月1日到9999年12月31日的日期和時(shí)間數(shù)據(jù),精確到3%秒(或30毫秒)。存儲(chǔ)長(zhǎng)度為8字節(jié),日期和時(shí)間各用4字節(jié)存儲(chǔ)。第一個(gè)四字節(jié)存儲(chǔ)自1900年1月1日之前或之后的天數(shù)(1900年1月1日之前的日期天數(shù)小于0,1900年1月1日之后的日期天數(shù)大于0),另外一個(gè)4字節(jié)存儲(chǔ)以午夜(00:00:00.000)后毫秒數(shù)所代表的每天的時(shí)間系統(tǒng)數(shù)據(jù)類型--日期型系統(tǒng)數(shù)據(jù)類型--日期型smalldatetime類型用于存儲(chǔ)從1900年1月1日到2079年6月6日的日期和時(shí)間數(shù)據(jù),精確到分鐘。它只需4個(gè)字節(jié)的存儲(chǔ)空間,第一個(gè)2字節(jié)存儲(chǔ)自1900年1月1日之后的天數(shù),另外一個(gè)2字節(jié)存儲(chǔ)以午夜(00:00:00.000)后的分鐘數(shù)。精度小于datetime類型,包含的日期范圍較窄,但占用的空間小。對(duì)于定義為日期時(shí)間數(shù)據(jù)類型的字段,并不需要同時(shí)輸入日期和時(shí)間,可省略其中的一個(gè)。如果只指定時(shí)間,則日期默認(rèn)為1900年1月1日;如果只指定日期,則時(shí)間默認(rèn)為12:00AM默認(rèn)情況下,日期型數(shù)據(jù)的格式是按照“月/日/年”的順序來(lái)設(shè)定的。系統(tǒng)數(shù)據(jù)類型--日期型英文+數(shù)字:月份可用英文命名或縮寫,不區(qū)分大小寫,年月日之間可不用逗號(hào)。年份可4位或兩位。若為兩位,小于50為2000年后的年份,大于或等于50則為1900年后的年份,若日部分省略,則為當(dāng)月1日。如:‘1980mar5’數(shù)字+分隔符可使用斜杠(/)、連字符(-)或句號(hào)(.)作為分隔符來(lái)指定月、日、年。如:‘4/15/1998’,‘1978-04-15’,’1998.04.15’、常見的日期類型輸入格式:整型數(shù)據(jù)類型存儲(chǔ)不帶小數(shù)的精確數(shù)字,包括年齡、數(shù)量等,有4種整數(shù)數(shù)據(jù)類型用于存儲(chǔ)不同范圍的值:數(shù)據(jù)類型存儲(chǔ)字節(jié)數(shù)取值范圍使用說(shuō)明Bigint8-263~263-1存儲(chǔ)非常大的正負(fù)整數(shù),如科學(xué)計(jì)算Int4-231~231-1存儲(chǔ)正負(fù)整數(shù)Smallint2-215~215-1存儲(chǔ)正負(fù)整數(shù)Tinyint10~255存儲(chǔ)小范圍正整數(shù)系統(tǒng)數(shù)據(jù)類型—整型數(shù)據(jù)類型精確數(shù)值數(shù)據(jù)類型存儲(chǔ)帶小數(shù)的精確數(shù)字,有兩種精確的數(shù)值數(shù)據(jù)類型:decimal和numeric。格式如下:decimal[(p[,s])]

numeric[(p[,s])]其中:p指定精度,即可存儲(chǔ)的十進(jìn)制數(shù)字的最大位數(shù),即除小數(shù)點(diǎn)之外的位數(shù)。s指定小數(shù)位數(shù),即小數(shù)點(diǎn)右邊可以存儲(chǔ)的十進(jìn)制數(shù)字的最大位數(shù)。P默認(rèn)值為18,S默認(rèn)值為0,最大可存儲(chǔ)38位十進(jìn)制數(shù)。系統(tǒng)數(shù)據(jù)類型—精確數(shù)值數(shù)據(jù)類型近似數(shù)據(jù)類型用來(lái)存儲(chǔ)系統(tǒng)所能提供的最大精度的實(shí)數(shù)數(shù)據(jù),由于是一種近似數(shù)據(jù),存在誤差,故不能用于需要固定精度的運(yùn)算,如貨幣數(shù)據(jù)的運(yùn)算中,可存儲(chǔ)非常大或小的數(shù)字,如恒星的質(zhì)量與大小。近似數(shù)據(jù)類型有兩種:real和float或float(n)real數(shù)據(jù)類型默認(rèn)精確到第7位小數(shù)。每個(gè)real類型的數(shù)據(jù)占用4個(gè)字節(jié)的存儲(chǔ)空間。float數(shù)據(jù)類型默認(rèn)精確到第15位小數(shù)。每個(gè)float類型的數(shù)據(jù)占用8個(gè)字節(jié)的存儲(chǔ)空間。系統(tǒng)數(shù)據(jù)類型—近似數(shù)據(jù)類型(實(shí)數(shù))

float數(shù)據(jù)類型可寫成float(n)的形式,n指定float數(shù)據(jù)尾數(shù)的位數(shù),為1~53之間的整數(shù)。當(dāng)n取1~24時(shí)實(shí)際上定義了一個(gè)real類型的數(shù)據(jù),系統(tǒng)用4個(gè)字節(jié)存儲(chǔ)。當(dāng)n取25~53時(shí)系統(tǒng)認(rèn)為是float類型的數(shù)據(jù),用8個(gè)字節(jié)存儲(chǔ)。注意:Unicode字符型是基于SQL-92標(biāo)準(zhǔn)中的NationalCharacter數(shù)據(jù)類型的。Unicode字符串常量的前面有一個(gè)大寫N

,例如,'Student',是字符串常量,而N'Student',則是Unicode字符型常量。

SQLServer允許使用多國(guó)語(yǔ)言,可采用Unicode

標(biāo)準(zhǔn)字符集。Unicode

字符串的格式與普通字符串相似,但Unicode

數(shù)據(jù)中的每個(gè)字符都使用兩個(gè)字節(jié)進(jìn)行存儲(chǔ)。Unicode字符型有nchar、nvarchar和ntext三種系統(tǒng)數(shù)據(jù)類型--Unicode字符型nvarchar[(n)]存放可變長(zhǎng)度的Unicode字符類型,n的取值為1~4000。nchar[(n)]存放固定長(zhǎng)度的Unicode字符類型,n的取值為1~4000。ntext

、Nvarchar(Max)最多存放包含個(gè)230-1個(gè)Unicode字符。注意:nchar、nvarchar和ntext的用法分別與char、varchar和text相同,只是Unicode支持的字符范圍更大,存儲(chǔ)Unicode字符所需的空間更大(Unicode數(shù)據(jù)中的每個(gè)字符都使用兩個(gè)字節(jié)進(jìn)行存儲(chǔ))。

Unicode字符數(shù)據(jù)類型貨幣數(shù)據(jù)類型包括money和smallmoney兩種。money用于存儲(chǔ)貨幣值,存儲(chǔ)在money數(shù)據(jù)類型中的數(shù)值以一個(gè)正數(shù)部分和一個(gè)小數(shù)部分存儲(chǔ)在兩個(gè)4字節(jié)的整型值中,存儲(chǔ)范圍-9223372136854775808~9223372136854775807,精確到貨幣單位的1%

。smallmoney與money數(shù)據(jù)類型類似,但范圍比money數(shù)據(jù)類型小,其存儲(chǔ)范圍為-2147483468到2147483467之間,精確到貨幣單位的1%。系統(tǒng)數(shù)據(jù)類型--貨幣型位數(shù)據(jù)類型bit位數(shù)據(jù)類型,其數(shù)據(jù)有兩種取值:0和1,長(zhǎng)度為1字節(jié)。在輸入0以外的其他值時(shí),系統(tǒng)均把它們當(dāng)1看待。適用于判斷真/假的場(chǎng)合,通常用來(lái)存放布爾數(shù)據(jù)。

Uniqueidentifier用于存儲(chǔ)一個(gè)16字節(jié)長(zhǎng)的二進(jìn)制數(shù)據(jù)類型,它是SQLServer根據(jù)計(jì)算機(jī)網(wǎng)卡地址和CPU時(shí)鐘使用NewId()函數(shù)產(chǎn)生的全局惟一標(biāo)識(shí)符代碼(GloballyUniqueIdentifier,簡(jiǎn)寫為GUID)?Timestamp時(shí)間戳數(shù)據(jù)類型,它提供數(shù)據(jù)庫(kù)范圍內(nèi)的惟一值,反應(yīng)數(shù)據(jù)庫(kù)中數(shù)據(jù)修改的相對(duì)順序,相當(dāng)于一個(gè)單調(diào)上升的計(jì)數(shù)器。當(dāng)它所定義的列在更新或插入數(shù)據(jù)時(shí)會(huì)被自動(dòng)更新,一個(gè)計(jì)數(shù)值將自動(dòng)地添加到此Timestamp數(shù)據(jù)列中,該值大于以前的值。用戶不能直接設(shè)置timestamp列的值,一個(gè)表只能有一個(gè)timestamp列??梢允褂胻imestamp列的值判斷自從上次檢索之后是否有其他進(jìn)程修改數(shù)據(jù)行。系統(tǒng)數(shù)據(jù)類型--其它數(shù)據(jù)類型Table用于存儲(chǔ)對(duì)表或者視圖處理后的臨時(shí)結(jié)果集。Sql_variant(可變數(shù)據(jù)類型):通配符數(shù)據(jù)類型,用于存儲(chǔ)除文本、圖形數(shù)據(jù)和Timestamp類型數(shù)據(jù)外的其他SQLServer數(shù)據(jù)。

XML可以存儲(chǔ)可擴(kuò)展標(biāo)記文本數(shù)據(jù)的數(shù)據(jù)類型。利用它可以將XML實(shí)例存儲(chǔ)在表列中或者XML類型的變量中。

Cursor這是變量或存儲(chǔ)過(guò)程OUTPUT參數(shù)的一種數(shù)據(jù)類型,表示對(duì)游標(biāo)的引用,不能用于列定義。系統(tǒng)數(shù)據(jù)類型--其它數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型SQLSERVER允許用戶自定義數(shù)據(jù)類型,用戶自定義數(shù)據(jù)類型是建立在SQLServer系統(tǒng)數(shù)據(jù)類型基礎(chǔ)上的。當(dāng)多個(gè)表的列中要存儲(chǔ)同樣類型的數(shù)據(jù),且想確保這些列具有完全相同的數(shù)據(jù)類型、長(zhǎng)度和為空性時(shí),可使用用戶定義數(shù)據(jù)類型。例如,可以基于smalldatetime

數(shù)據(jù)類型創(chuàng)建名為birthday的用戶定義數(shù)據(jù)類型,用來(lái)刻畫“出生日期”字段。定義用戶自定義數(shù)據(jù)類型時(shí),需要指定該類型的名稱,依賴的系統(tǒng)數(shù)據(jù)類型,及是否允許為空值。創(chuàng)建用戶定義的數(shù)據(jù)類型的方法有兩種:(1)使用對(duì)象資源管理器(2)使用系統(tǒng)存儲(chǔ)過(guò)程sp_addtype

通過(guò)對(duì)象資源管理器創(chuàng)建用戶定義的數(shù)據(jù)類型在“對(duì)象資源管理器”窗口中,選擇“數(shù)據(jù)庫(kù)”節(jié)點(diǎn)在選擇要在其中創(chuàng)建用戶定義數(shù)據(jù)類型的數(shù)據(jù)庫(kù)”studentCourse”“可編程性”節(jié)點(diǎn)“類型”節(jié)點(diǎn)“用戶定義數(shù)據(jù)類型”節(jié)點(diǎn),右擊“用戶定義數(shù)據(jù)類型”,在彈出的快捷菜單中選擇“新建用戶定義數(shù)據(jù)類型"命令。輸入新建數(shù)據(jù)類型的名稱。在“數(shù)據(jù)類型”列表中,選擇基礎(chǔ)數(shù)據(jù)類型。如“精度”處于活動(dòng)狀態(tài),若要更改此數(shù)據(jù)類型可存儲(chǔ)的最大數(shù)據(jù)長(zhǎng)度,請(qǐng)鍵入另外的值。若要允許此數(shù)據(jù)類型接受空值,請(qǐng)選擇“允許空值”命令。在"規(guī)則"和"默認(rèn)值"列表中選擇一個(gè)規(guī)則或默認(rèn)值(若有)以將其綁定到用戶定義數(shù)據(jù)類型上。語(yǔ)法如下:sp_addtype

type_name,phystype[(length)|([precision,scale]),null|notnull|identity]其中:type_name,用戶定義的數(shù)據(jù)類型的名字;Phystype,用戶自定義數(shù)據(jù)類型所基于的系統(tǒng)數(shù)據(jù)類型,可以包括長(zhǎng)度、精度、標(biāo)度;null|notnull|identity,用戶自定義數(shù)據(jù)類型的性質(zhì),分別為允許空值、不允許為空值、具有標(biāo)識(shí)列性質(zhì)。默認(rèn)為notnull。利用系統(tǒng)存儲(chǔ)過(guò)程創(chuàng)建用戶定義數(shù)據(jù)類型下面創(chuàng)建一個(gè)名為birthday的用戶定義數(shù)據(jù)類型(基于smalldatetime),不允許取空值。USEStudentCourseEXECsp_addtypebirthday,datetime,‘NOTNULL'下面的示例為國(guó)內(nèi)及國(guó)際電話和傳真號(hào)碼分別創(chuàng)建兩個(gè)用戶定義的數(shù)據(jù)類型telephone和fax。USEStudentCourseEXECsp_addtypetelephone,'varchar(24)','NOTNULL'EXECsp_addtypefax,'varchar(24)','NULL'注意用戶定義的數(shù)據(jù)類型名稱在數(shù)據(jù)庫(kù)中必須是唯一的,但是名稱不同的用戶定義的數(shù)據(jù)類型可以有相同的定義。執(zhí)行sp_addtype

創(chuàng)建的用戶定義的數(shù)據(jù)類型,會(huì)添加到當(dāng)前數(shù)據(jù)庫(kù)的systypes

系統(tǒng)表中。如果想在所有新創(chuàng)建的數(shù)據(jù)庫(kù)中都可使用這一用戶定義的數(shù)據(jù)類型,可將其添加到model數(shù)據(jù)庫(kù)中。在創(chuàng)建了用戶數(shù)據(jù)類型之后,可在CREATETABLE或ALTERTABLE中使用它,也可以將默認(rèn)值和規(guī)則綁定到用戶定義的數(shù)據(jù)類型。不能使用timestamp數(shù)據(jù)類型來(lái)定義用戶定義的數(shù)據(jù)類型。刪除用戶定義的數(shù)據(jù)類型如果沒(méi)有任何表或其它數(shù)據(jù)庫(kù)對(duì)象引用某用戶定義數(shù)據(jù)類型時(shí),可除去這種數(shù)據(jù)類型。(1)使用對(duì)象資源管理器

“數(shù)據(jù)庫(kù)”節(jié)點(diǎn)在選擇要在其中刪除用戶定義數(shù)據(jù)類型的數(shù)據(jù)庫(kù)”studentCourse”“可編程性”節(jié)點(diǎn)“類型”節(jié)點(diǎn)“用戶定義數(shù)據(jù)類型”節(jié)點(diǎn),選中要?jiǎng)h除的用戶定義數(shù)據(jù)類型,右擊在彈出的快捷菜單中選擇“刪除"命令。(2)使用系統(tǒng)存儲(chǔ)過(guò)程查看、重命名、刪除用戶定義的數(shù)據(jù)類型。 sp_helptype_name查看用戶自定義數(shù)據(jù)類型的特征;sp_rename

oldname,newname

給用戶自定義數(shù)據(jù)類型重新命名;sp_droptypetype_name刪除一個(gè)已經(jīng)定義且未被使用的用戶自定義數(shù)據(jù)類型。例如:USEStudentCourseEXECsp_droptype'birthday'字段數(shù)據(jù)類型的確定原則為一個(gè)字段選擇數(shù)據(jù)類型時(shí),應(yīng)選擇能支持用戶可能在該字段存儲(chǔ)的所有數(shù)據(jù)的數(shù)據(jù)類型,同時(shí)所需的空間量最小??蓞⒄找韵略瓌t:為字段選擇一個(gè)合適的長(zhǎng)度,如果字段值的長(zhǎng)度不需要大幅改變,就使用固定長(zhǎng)度數(shù)據(jù)類型(char和Nchar),例如學(xué)號(hào)、課程號(hào)等。如果屬性值的長(zhǎng)度需要大幅改變,就使用可變長(zhǎng)度數(shù)據(jù)類型(Varchar和Nvarchar),例如存儲(chǔ)學(xué)生簡(jiǎn)歷等。如果用戶存儲(chǔ)的字符串來(lái)源于不同的國(guó)家,就使用Unicode數(shù)據(jù)類型。3.1.3約束的類型(1)非空值約束(NotNull):限制字段不接受NULL值,即當(dāng)對(duì)表進(jìn)行插入(INSERT)操作時(shí),非空值約束的字段必須給出確定的值??罩凳侵肝刺顚?、未知、不可用或?qū)⒃谝院筇砑拥臄?shù)據(jù),并不等價(jià)于空字符串或數(shù)值0。(2)默認(rèn)約束(Default):為字段定義一個(gè)默認(rèn)值,輸入數(shù)據(jù)時(shí)若沒(méi)有為該字段提供值,則將所定義的默認(rèn)值提供給該列。默認(rèn)值可以是常量,也可以是表達(dá)式。(3)惟一性約束(Unique):限制約束的字段,不允許有兩條記錄具有相同的非空值。但該字段可以出現(xiàn)多個(gè)空值。(4)主鍵約束(PrimaryKey):標(biāo)識(shí)字段或字段的組合為主鍵,主鍵的值惟一標(biāo)識(shí)表中的每一條記錄。在一個(gè)表中,不能有兩條記錄包含相同的主鍵值,主鍵的各組成字段的值也不能為NULL。(5)外鍵約束(ForeignKey):通常是根據(jù)從另一個(gè)表中某字段(通常是主鍵)獲得的數(shù)據(jù)集合來(lái)進(jìn)行有效性判定。這時(shí),被約束字段所在的表稱為外鍵表,提供數(shù)據(jù)的表稱為主鍵表或引用表,提供數(shù)據(jù)的字段稱為引用字段,所提供的數(shù)據(jù)稱為鍵值。外鍵常用來(lái)標(biāo)識(shí)表與表之間的關(guān)系。外鍵與關(guān)系中的外關(guān)鍵字是等價(jià)的。

(6)檢查約束(check):一個(gè)檢查約束由一個(gè)關(guān)鍵字CHECK后面跟著一個(gè)放在圓括弧里的布爾表達(dá)式組成。檢查約束允許用戶聲明該字段里的數(shù)值必須滿足該布爾表達(dá)式。3.2表的創(chuàng)建兩種方法:1.使用對(duì)象資源管理器創(chuàng)建表2.使用CREATETABLE語(yǔ)句創(chuàng)建表使用CREATETABLE語(yǔ)句創(chuàng)建表創(chuàng)建一個(gè)基本表要對(duì)基本表命名,定義表的每個(gè)列,并定義表的完整性約束條件。CREATETABLE語(yǔ)句格式如下:

CREATETABLE<表名>(<列定義>,…,<列定義>[,<表約束定義>,…,<表約束定義>]);定義基本表—列定義<列定義>定義每個(gè)列的名稱、類型、缺省值和列上的約束條件:

<列定義>::=<列名><數(shù)據(jù)類型>[DEFAULT<缺省值>][<列約束定義>,…,<列約束定義>]可選短語(yǔ)“DEFAULT<缺省值>”定義列上的缺省值,<缺省值>是一個(gè)特定值或NULL;每個(gè)列上可定義零個(gè)或或多個(gè)約束條件,約束列的取值定義基本表—列約束定義<列約束定義>

::=

[CONSTRAINT<約束名>]<列約束><列約束>

::={NOTNULL|PRIMARYKEY|UNIQUE|

CHECK(<條件>)}其中:NOTNULL:該列不允許取空值,不加NOTNULL限制時(shí),該列可以取空值。PRIMARYKEY:指明該列是主碼,其值非空、惟一。UNIQUE:該列上的值必須惟一,相當(dāng)于說(shuō)明該列為候選碼CHECK(<條件>):<條件>是一個(gè)涉及該列的布爾表達(dá)式,指明該列的值必須滿足的條件,

定義基本表—表約束定義

一個(gè)表可包含零個(gè)或多個(gè)<表約束定義>,用于定義主碼、候選碼、外碼和表上的其它約束。表約束定義定義形式如下:[CONSTRAINT<約束名>]<表約束><表約束>::={PRIMARYKEY(A1,…,Ak)|

UNIQUE(A1,…,Ak)|

CHECK(<條件>)|FOREIGNKEY(A1,…,Ak)REFERENCES<外表名>(<外表主碼>)<參照觸發(fā)動(dòng)作>]

}表約束定義說(shuō)明PRIMARYKEY(A1,…,Ak):說(shuō)明屬性列A1,…,Ak構(gòu)成該關(guān)系的主碼。當(dāng)主碼只包含一個(gè)屬性時(shí),通常用列約束定義主碼。UNIQUE(A1,…,Ak):說(shuō)明屬性列A1,…,Ak上的值必須惟一;相當(dāng)于說(shuō)明A1,…,Ak構(gòu)成該關(guān)系的候選碼。當(dāng)候選碼只包含一個(gè)屬性時(shí),通常用列約束定義候選碼。CHECK(<條件>):說(shuō)明該表上的一個(gè)完整性約束條件。通常<條件>是涉及該表一個(gè)或多個(gè)列的布爾表達(dá)式表約束定義說(shuō)明外碼比較復(fù)雜:

FOREIGNKEY(A1,…,Ak)REFERENCES<外表名>(<外表主碼>)[<參照觸發(fā)動(dòng)作>]屬性A1,…,Ak是關(guān)系(表)的外碼<外表名>給出被參照關(guān)系的表名<外表主碼>給出被參照關(guān)系的主碼<參照觸發(fā)動(dòng)作>說(shuō)明違反參照完整性時(shí)需要采取的措施:其中<參照動(dòng)作>可以是CASCADE、SETNULL、SETDEFAULT和NOACTION

之一,例4.1下面的語(yǔ)句創(chuàng)建教師表TeacherCREATETABLETeacher

(教師號(hào) CHAR(7)PRIMARYKEY,

姓名 CHAR(10)NOTNULL,

性別CHAR(2)CHECK(性別=‘男’OR性別=‘女’),

出生日期DATETIME,

職稱 CHAR(6),

所在系號(hào) CHAR(4),

FOREIGNKEY(所在系號(hào))REFERENCES系(系號(hào)));CREATETABLE語(yǔ)句的較完整格式CREATETABLE[數(shù)據(jù)據(jù)庫(kù)名.]數(shù)據(jù)庫(kù)表名(列名數(shù)據(jù)類型[NOTNULL][identity(初值,步長(zhǎng))][DEFAULT默認(rèn)值][UNIQUE][PRIMARYKEY]

[CLUSTERED|NONCLUSTERED]

[,...n][,列名AS計(jì)算列值的表達(dá)式[,…n]][,[CONSTRAINT約束名]PRIMARYKEY(屬性名)[ASC|DESC][,...n]][,[CONSTRAINT約束名]CHECK(邏輯表達(dá)式)[,n]][,[CONSTRAINT約束名]FOREIGNKEY(外鍵屬性)REFERENCES參照表(參照屬性)

[ONDELETE{CASCADE|NOACTION}]

[ONUPDATE{CASCADE|NOACTION}][,...n][,[CONSTRAINT約束名]UNIQUE(屬性名)[,...n])[ON{文件組名|DEFAULT}]【例】創(chuàng)建數(shù)據(jù)表book,由書號(hào)、書名、出版社、出版日期、單價(jià)、數(shù)量、總價(jià)(單價(jià)*數(shù)量)、電子郵件地址字段組成。其中:書號(hào)列定義為主鍵并且為系統(tǒng)自動(dòng)編號(hào)即標(biāo)識(shí)列,種子值(起始值)為1000,增量為1。要求出版社字段的值只能是高教、浙大、電子和中央四個(gè)之一。電子郵件字段中必須包含@符號(hào)。單價(jià)必須大于0,數(shù)量必須大于等于0,出版日期的默認(rèn)值設(shè)置為當(dāng)前日期函數(shù)。說(shuō)明(1)Identity屬性:可將表中的某列指定為自動(dòng)增長(zhǎng)列,當(dāng)表中新增行時(shí),系統(tǒng)自動(dòng)為新行在該列上填充新值。標(biāo)識(shí)屬性有兩個(gè)參數(shù):初值和增量(步長(zhǎng))。每個(gè)表只能有一個(gè)自動(dòng)增長(zhǎng)列,該列的數(shù)據(jù)類型必須定義為整型或不帶小數(shù)的decimal和numeric型。設(shè)置book表中的屬性“書號(hào)”為Identity屬性CREATETABLEbook(書號(hào)intidentity(1000,1),……)(2)計(jì)算所得的列該列由同一個(gè)表中其他列通過(guò)“計(jì)算列值的表達(dá)式”計(jì)算得到,并不存儲(chǔ)具體數(shù)據(jù)注意:計(jì)算列的值不能修改計(jì)算列不能使用默認(rèn)值約束、外鍵約束及非空值約束例如:設(shè)置book表中屬性“總價(jià)”為計(jì)算所得到的列CREATETABLEbook(……總價(jià)AS單價(jià)*數(shù)量,……)(3)Cheak約束:每個(gè)列可有一個(gè)或多個(gè)check約束,約束條件是邏輯表達(dá)式。列級(jí)check約束只能引用該列本身,表級(jí)check約束可引用同一個(gè)表中的列。CREATETABLEbook(……單價(jià)smallintcheck(單價(jià)>0),數(shù)量smallintcheck(數(shù)量>=0),電子郵件地址varchar(25)check(電子郵件地址like'%@%'),check(出版社in('高教','浙大','電子','中央'),……)Like的匹配方式LIKE:主要用于在邏輯表達(dá)式中對(duì)字符串進(jìn)行比較,它的否定形式為NOTLIKE。語(yǔ)法格式匹配表達(dá)式

[NOT]LIKE模式[ESCAPEescape_character

]ESCAPE

子句定義轉(zhuǎn)義符:搜索包含一個(gè)或多個(gè)特殊通配符的字符串4種字符串匹配方式見下表通配符描述示例%包含零個(gè)或更多字符的任意字符串WHEREtitlelike‘%computer%’將查找書名包含單詞computer的所有書名_(下劃線)任何單個(gè)字符WHEREau_fnamelike‘_ean’將查找以ean

結(jié)尾的所有4個(gè)字母的名字(Dean、Sean等)[]范圍([a-d])或集合([abcd])中的任何單個(gè)字符WHEREau_lnamelike‘[C-P]arsen’將查找以arsen

結(jié)尾且以介于C與P之間的任何單個(gè)字符開始的作者姓氏,例如Carsen、Larsen等[^]不屬于指定范圍([a-d])或集合([abcd)中任何單個(gè)字符WHEREau_lnamelike‘de[^i]%’將查找以de開始且其后的字母不為i的所有作者的姓氏。創(chuàng)建book表的完整命令如下:CREATETABLEbook(書號(hào)intidentity(1000,1)PRIMARYKEY,書名varchar(20)notnull,出版社varchar(20),出版日期datetimeDEFAULT(getdate()),單價(jià)smallintcheck(單價(jià)>0),數(shù)量smallintcheck(數(shù)量>=0),總價(jià)as單價(jià)*數(shù)量,電子郵件varchar(25),check(電子郵件like'%@%'),check(出版社in('高教','浙大','電子','中央')))示例為studentCourse數(shù)據(jù)庫(kù)定義如下三個(gè)關(guān)系數(shù)據(jù)表:列名數(shù)據(jù)類型長(zhǎng)度允許空默認(rèn)值是否主鍵學(xué)號(hào)char5√姓名char8性別char2男出生日期datetime1980-01-01系varchar20電話

char8√學(xué)生基本信息表S列名數(shù)據(jù)類型長(zhǎng)度允許空默認(rèn)值是否主鍵課程號(hào)char3

√課程名varchar20學(xué)分smallint√預(yù)選課程號(hào)char3√教師char8√課程數(shù)據(jù)表C學(xué)生選課數(shù)據(jù)表SC列名數(shù)據(jù)類型長(zhǎng)度允許空默認(rèn)值是否主鍵學(xué)號(hào)char5√課程號(hào)char3成績(jī)SMALLINT2√數(shù)據(jù)庫(kù)的完整性定義

列名UNIQUECHECKFOREIGN學(xué)號(hào)由a-z間字母開頭,后面只能取0-9之間的數(shù)字,限5位性別性別的值只能取‘男’或‘女’電話

電話的格式為021-7777學(xué)生基本信息表S約束列名UNIQUECHECKFOREIGN課程號(hào)由字母C開頭,后2位只能取0-9之間的數(shù)字預(yù)選課程號(hào)參照C.課程號(hào)課程數(shù)據(jù)表C約束列名UNIQUECHECKFOREIGN課程號(hào)√參照C.課程號(hào)學(xué)號(hào)參照S.學(xué)號(hào)成績(jī)成績(jī)只能在0到100之間或者是空值學(xué)生選課數(shù)據(jù)表SC約束1)創(chuàng)建學(xué)生基本信息表S的語(yǔ)句如下:CREATETABLES(

學(xué)號(hào)Char(5)

NOTNULL,

姓名Char(8)

NOTNULL,

性別Char(2)

NOTNULL

default('男'),

出生日期

DatetimeNOTNULLDEFAULT('19800101'),

Varchar(20),

電話

Char(8),

CHECK(學(xué)號(hào)

Like'[A-Z][0-9][0-9][0-9][0-9]'),

CHECK(性別='女'OR性別='男'),

CHECK(電話

Like'[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),CONSTRAINTPK_SPRIMARYKEYCLUSTERED(學(xué)號(hào)ASC))ON[PRIMARY]2)創(chuàng)建課程表C的語(yǔ)句如下:CREATETABLEC(

課程號(hào)Char(3)NOTNULL,

課程名Varchar(20)

NOTNULL,

學(xué)分

Smallint

NULL,

預(yù)選課程號(hào)

Char(3)

NULL,

教師

Char(8)

NULL,

CONSTRAINTFK_PcnoFOREIGNKEY(預(yù)選課程號(hào))

REFERENCESC(課程號(hào)),CONSTRAINTCK_CnoCHECK(課程號(hào)

Like'C[0-9][0-9]'),CONSTRAINTPK_CPRIMARYKEYCLUSTERED(課程號(hào)ASC))ON[PRIMARY]3)創(chuàng)建學(xué)生選課數(shù)據(jù)表SC的語(yǔ)句如下:CREATETABLESC

(

學(xué)號(hào)Char(5)NOTNULL,課程號(hào)Char(3)NOTNULL,成績(jī)SmallintNULL,FOREIGNKEY(課程號(hào))REFERENCESC(課程號(hào)),FOREIGNKEY(學(xué)號(hào))REFERENCESS(學(xué)號(hào)),CHECK(成績(jī)>=(0)AND成績(jī)<=(100)OR成績(jī)

ISNULL),PRIMARYKEYCLUSTERED(學(xué)號(hào)ASC,課程號(hào)

ASC)

)也可將約束定義在列級(jí),各約束名由系統(tǒng)自動(dòng)產(chǎn)生:1)創(chuàng)建學(xué)生基本信息表S的語(yǔ)句如下:CREATETABLES(

學(xué)號(hào)Char(5)

NOTNULL

CHECK(學(xué)號(hào)

Like'[A-Z][0-9][0-9][0-9][0-9]')

PrimarykeyClustered,

姓名Char(8)

NOTNULL,

性別Char(2)

NOTNULL

default('男')

CHECK(性別='女'

OR性別='男'),

出生日期

DatetimeNOTNULLDEFAULT('19800101'),

Varchar(20)

NOTNULL,

電話

Char(8)

NULL

CHECK(電話

Like'[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'))ON[PRIMARY]2)創(chuàng)建課程表C的語(yǔ)句如下:CREATETABLEC(

課程號(hào)Char(3)NOTNULL

CHECK(課程號(hào)

Like'C[0-9][0-9]')

PRIMARYKEYCLUSTERED,

課程名Varchar(20)

NOTNULL,

學(xué)分

Smallint

NULL,

預(yù)選課程號(hào)

Char(3)

NULL

FOREIGNKEY(預(yù)選課程號(hào))

REFERENCESC(課程號(hào)),

教師

Char(8)

NULL,)ON[PRIMARY]3)創(chuàng)建學(xué)生選課數(shù)據(jù)表SC的語(yǔ)句如下:CREATETABLESC(

學(xué)號(hào)Char(5)NOTNULL

FOREIGNKEY(學(xué)號(hào))REFERENCESS(學(xué)號(hào)),課程號(hào)Char(3)NOTNULL

FOREIGNKEY(課程號(hào))REFERENCESC(課程號(hào)),

成績(jī)SmallintNULL

CHECK(成績(jī)>=(0)AND成績(jī)<=(100)OR成績(jī)

ISNULL),PRIMARYKEYCLUSTERED(學(xué)號(hào)ASC,課程號(hào)

ASC))使用對(duì)象資源管理器創(chuàng)建表步驟如下:1、在【對(duì)象資源管理器】窗口中,展開的“數(shù)據(jù)庫(kù)”節(jié)點(diǎn),右擊需在其中創(chuàng)建數(shù)據(jù)表的數(shù)據(jù)庫(kù)studentcourse的【表】項(xiàng),在出現(xiàn)的快捷菜單中選擇【新建表】,出現(xiàn)表設(shè)計(jì)器窗口。2、在【列名】中依次輸入列名,在【數(shù)據(jù)類型】中選擇數(shù)據(jù)類型,并選擇各個(gè)列是否允許空值,也可在下部的【列屬性】對(duì)話框中修改某列的屬性:包括標(biāo)識(shí)identity屬性、計(jì)算所得到的列、默認(rèn)值等,如下圖示3、選中要設(shè)為主鍵的行,單擊工具欄上的【設(shè)置主鍵】按鈕或右擊并在彈出的快捷菜單中選擇【設(shè)置主鍵】命令。4、單擊工具欄上的【管理check約束】按鈕或在表設(shè)計(jì)器中右擊在彈出的快捷菜單中選擇【check約束】命令,在彈出的“check約束”對(duì)話框中設(shè)置check約束(添加、刪除,關(guān)閉)。5、單擊工具欄中的【保持】按鈕,出現(xiàn)【選擇名稱】對(duì)話框,輸入表名,單擊【確定】,該表出現(xiàn)在【對(duì)象資源管理器】窗口的【表】項(xiàng)下【例】創(chuàng)建數(shù)據(jù)表book【例】創(chuàng)建數(shù)據(jù)庫(kù)“studentcourse”的學(xué)生基本信息表S、課程表C、選課表SC6、若要在多個(gè)表中設(shè)置外鍵關(guān)系,可單擊工具欄上的【關(guān)系】按鈕或在表設(shè)計(jì)器中右擊在彈出的快捷菜單中選擇【關(guān)系】命令,設(shè)置各表之間的外鍵關(guān)系7、單擊【外鍵關(guān)系】對(duì)話框中【表和列規(guī)范】右邊的按鈕,在彈出的【表和列】對(duì)話框中選擇主鍵表和外鍵表,設(shè)置外鍵關(guān)系,返回【外鍵關(guān)系】對(duì)話框,在該對(duì)話框的【標(biāo)識(shí)】中更改外鍵的名稱,完成外鍵的設(shè)置。查看表信息和屬性1.查看表數(shù)據(jù)啟動(dòng)SQLServerManagementStudio,選擇數(shù)據(jù)庫(kù),右擊要打開的表,選擇“打開表”命令,在右邊區(qū)域中將顯示表中所有的數(shù)據(jù)。2.查看表屬性啟動(dòng)SQLServerManagementStudio,選擇數(shù)據(jù)庫(kù),右擊要打開的表,選擇“屬性”命令,在右邊區(qū)域中將顯示表的屬性信息。或execsp_help

表名修改數(shù)據(jù)表結(jié)構(gòu)1.利用對(duì)象資源管理器增加(刪除)列和修改列增加列操作步驟:(1)右擊要修改的表,選擇“修改”命令,打開【表設(shè)計(jì)器】窗口。(2)若要在固定列之前加入新屬性,可在該列上右擊,選擇“插入列”。然后輸入列名以及相關(guān)設(shè)置。

2)刪除列操作選擇要?jiǎng)h除的列,右擊彈出的快捷菜單中選擇“刪除列”命令:3)修改列:在【表設(shè)計(jì)器】中選擇要修改的列,更改數(shù)據(jù)類型,設(shè)置identity屬性,及默認(rèn)值等2.利用T-SQL語(yǔ)言修改表【格式】:

ALTERTABLE<表名>{ALTERCOLUMN<列名>數(shù)據(jù)類型(寬度)

[NULL|NOTNULL]|ADD<列名>數(shù)據(jù)類型(寬度)[NULL|NOTNULL][約束][,…n]|ADD列名AS計(jì)算列值的表達(dá)式|DROPCOLUMN[<列名>[CASCADE︱RESTRICT]][,…n]|ADD

<table_constraint>|DROP[CONSTRAINT<約束名>|ALL][,…n]}2)說(shuō)明ALTERCOLUMN:修改指定列。列的修改不能與列或表的其他定義相沖突。如某列的默認(rèn)值為字符串,則數(shù)據(jù)類型不能更改為非字符串類型,要想修改必須先刪除默認(rèn)約束。DROPCOLUMN[<列名>[CASCADE︱RESTRICT]刪除指定列:CASCADE表示級(jí)聯(lián)刪除,即依賴于該列的數(shù)據(jù)庫(kù)對(duì)象(如涉及該列的視圖)一并刪除RESTRICT表示受限,僅當(dāng)沒(méi)有依賴于該列的數(shù)據(jù)庫(kù)對(duì)象時(shí)刪除才能成功【例】數(shù)據(jù)庫(kù)“studentcourse”中S表的系屬性修改為char(25),增加一個(gè)入學(xué)時(shí)間字段,它的數(shù)據(jù)類型為datetime,并設(shè)置默認(rèn)值為getdate(),最后刪除入學(xué)時(shí)間字段。方法一:使用SQLServerManagementStudio方法二:使用T-SQL命令。ALTERTABLESALTERCOLUMN系char(25)GoALTERTABLESADD入學(xué)時(shí)間datetime

DEFAULT(getdate())Go【例】數(shù)據(jù)庫(kù)“studentcourse”中的S表增加一個(gè)年齡字段,該字段由出生日期字段,結(jié)合當(dāng)前系統(tǒng)日期計(jì)算產(chǎn)生。Add年齡

asyear(getdate())-year(出生日期)將學(xué)生表S的性別默認(rèn)值修改為‘女’AltertableSALTERCOLUMN性別default('女')修改表的名稱方法一:使用對(duì)象資源管理器右擊要重命名的表,選擇【重命名】命令,在彈出的【重命名】窗口中輸入新表名。方法二:使用T-SQL命令:

sp_rename<原數(shù)據(jù)表名>,<新數(shù)據(jù)表名>如:EXECsp_rename'book','書籍資料'刪除表1.使用對(duì)象資源管理器刪除表右擊要?jiǎng)h除的表,選擇“刪除”命令。

2.使用DROPTABLE語(yǔ)句刪除表:DROPTABLE表名[,…n]例如:droptables刪除表時(shí),表上的規(guī)則或默認(rèn)值將解除綁定,任何與表關(guān)聯(lián)的約束或觸發(fā)器將自動(dòng)刪除。定義有外鍵約束的表必須先刪除外鍵約束,才能刪除系統(tǒng)表不能使用DROPTABLE語(yǔ)句刪除。3.3數(shù)據(jù)表的操作使用對(duì)象資源管理器插入、修改與刪除表中的數(shù)據(jù)選中要插入數(shù)據(jù)的表名,單擊鼠標(biāo)右鍵,在出現(xiàn)的快捷菜單中選中【打開表】,將會(huì)出現(xiàn)一個(gè)窗口供用戶按行輸入數(shù)據(jù)。輸入結(jié)束后,直接關(guān)閉該窗口就能將用戶輸入寫入數(shù)據(jù)庫(kù)中。2.使用T-SQL語(yǔ)句插入、修改與刪除表中的數(shù)據(jù)1)插入數(shù)據(jù)【格式】INSERTINTO數(shù)據(jù)表名(列名表)VALUES(元組值)INSERTINTO數(shù)據(jù)表名(列名表)SELECT查詢語(yǔ)句2)功能向指定數(shù)據(jù)表的屬性列插入數(shù)據(jù),VALUES后跟的元組值為屬性列提供數(shù)據(jù)。其中列名表中的屬性排列順序和VALUES后跟的元組值的排列順序要一致。對(duì)應(yīng)的數(shù)據(jù)類型要一致。如果沒(méi)有指定列名表,則表示數(shù)據(jù)表中的所有屬性列?!纠?】使用屬性列顯示指定插入到每個(gè)列的值

INSERTINTOs(學(xué)號(hào),姓名,性別,出生日期,系)VALUES('L0401','張?jiān)讫?,'男','1987-11-11',‘IS')Go【例2】將查詢結(jié)果插入數(shù)據(jù)表INSERTINTOSCSELECT'L0401',課程號(hào),80FROMCGo2)修改數(shù)據(jù)【格式】UPDATE表名SET列名=值表達(dá)式[,列名=值表達(dá)式…][WHERE條件表達(dá)式]【功能】將指定表中滿足WHERE子句條件的記錄的修改為指定屬性值。其中值表達(dá)式可以是常量、變量、表達(dá)式。若缺省WHERE,則修改表中的所有元組。但在進(jìn)行修改操作時(shí),需注意數(shù)據(jù)庫(kù)的一致性?!纠扛耂表中的出生日期列中的值變?yōu)樵錾掌谥导?UPDATESSET出生日期=出生日期+1【例】將選C01課程的學(xué)號(hào)是L0401的學(xué)生的成績(jī)改成85分UPDATESCSET成績(jī)=85WHERE課程號(hào)='C01'AND學(xué)號(hào)='L0401‘GO【例】將張?jiān)讫垖W(xué)生的成績(jī)減少5分UPDATESCSET成績(jī)=成績(jī)-5WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)FROMSWHERE姓名='張?jiān)讫?)3)刪除數(shù)據(jù)【格式】DELETEFROM表名[WHERE條件表達(dá)式]【例】刪除學(xué)號(hào)為L(zhǎng)0401的學(xué)生選課信息DELETEFROMSCWhere學(xué)號(hào)='L0401’【例】從SC表中刪除所有行DELETEFROMSC4)清空表中數(shù)據(jù)TruncateTable表名3.4數(shù)據(jù)完整性概述1.完整性的概念數(shù)據(jù)完整性是指數(shù)據(jù)的正確性、有效性、一致性和相容性。由于數(shù)據(jù)庫(kù)是一個(gè)動(dòng)態(tài)的集合,數(shù)據(jù)不斷地被插入和被修改,因此由于主觀或客觀的原因,可能破壞數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性。2.完整性分類

在SQLServer2005中,數(shù)據(jù)完整性分成四類:實(shí)體完整性、域完整性、參照完整性和用戶自定義完整性域完整性域完整性也可稱為列完整性。關(guān)系中每個(gè)屬性列都必須在一個(gè)值域上取值。保證該列具有正確的數(shù)據(jù)類型、格式以及有效的數(shù)據(jù)范圍。

例如,向SelectCourse庫(kù)的SC表的成績(jī)列輸入數(shù)據(jù)時(shí),不能出現(xiàn)字符,也不能輸入小于0或大于100的數(shù)值。域完整性要求DBMS對(duì)新插入的值進(jìn)行域完整性檢查,還要對(duì)查詢進(jìn)行檢測(cè),從而保證比較是有意義的域完整性在原理上類似于編程語(yǔ)言中變量的類型,就像不同的變量可以有相同的數(shù)據(jù)類型一樣,不同的屬性可以有相同的域。域完整性SQLSERVER提供了一些標(biāo)準(zhǔn)數(shù)據(jù)類型(域),也允許用戶根據(jù)需要定義新的域,聲明一個(gè)域包括(1)域值類型:包括數(shù)據(jù)的類型、長(zhǎng)度、單位、精度等例如,可以規(guī)定PersonName(人名)域的數(shù)據(jù)類型是字符型,長(zhǎng)度為8;RMB(人民幣)域和Dollars(美元)域的類型都是長(zhǎng)度為12位十進(jìn)制數(shù),小數(shù)點(diǎn)后有兩位(2)缺省值。例如可以規(guī)定RMB和Dollars域的缺省值為0.00(3)域值的格式。例如可以規(guī)定出生日期的格式為:YYYY.MM.DD(4)對(duì)取值范圍或取值集合的約束例如,可以規(guī)定性別域的取值集合為{男,女},學(xué)生成績(jī)域的取值范圍為[0,100]。域完整性由于域完整性規(guī)定不同域上的值不能比較,故可使用用戶自定義的域說(shuō)明屬性防止無(wú)意義的比較:例如,如果用字符串類型說(shuō)明屬性Dname(部門名)和Ename(職工名),則比較Dname=Ename是合法的,但這種比較沒(méi)有實(shí)際意義如果Dname說(shuō)明為部門域,Ename說(shuō)明為人名域,則系統(tǒng)可以通過(guò)域約束檢查,發(fā)現(xiàn)比較Dname=Ename不合法。完整性機(jī)制

為了保證數(shù)據(jù)完整性,DBMS應(yīng)能對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)完整性控制。在SQLServer2005中,提供了如下機(jī)制對(duì)數(shù)據(jù)完整性進(jìn)行控制:約束默認(rèn)值規(guī)則觸發(fā)器等定義約束是SQLServer2005實(shí)現(xiàn)數(shù)據(jù)完整性的主要手段:

定義主鍵約束——實(shí)體完整性default約束——域完整性定義外鍵約束——參照完整性CHECK約束——用戶自定義完整性默認(rèn)值在SQLServer2005中,在表中插入數(shù)據(jù)行時(shí),系統(tǒng)自動(dòng)為沒(méi)有指定數(shù)據(jù)的列提供事先定義的默認(rèn)值。使用默認(rèn)值有兩種方法:(1)在創(chuàng)建表時(shí)指定默認(rèn)值(DEFAULT約束)(2)使用CREATEDEFAULT語(yǔ)句創(chuàng)建默認(rèn)值對(duì)象,然后使用存儲(chǔ)過(guò)程將該默認(rèn)值對(duì)象綁定到指定的列上。

創(chuàng)建默認(rèn)值語(yǔ)法格式如下:CREATEDEFAULT默認(rèn)值名稱AS常量表達(dá)式

與DEFAULT約束不同的是,使用CREATEDEFAULT語(yǔ)句創(chuàng)建的默認(rèn)值是一種數(shù)據(jù)庫(kù)對(duì)象,在數(shù)據(jù)庫(kù)中只需定義一次后,就可以被一次或多次應(yīng)用于任意表中的一列或多列,還可以用于用戶自定義的數(shù)據(jù)類型。綁定默認(rèn)值對(duì)象默認(rèn)值對(duì)象創(chuàng)建后必須將其綁定到某列或用戶自定義的數(shù)據(jù)類型上才能使用。綁定可用存儲(chǔ)過(guò)程sp_bindefault,語(yǔ)法格式如下:

sp_bindefault[@defname=]'default',[@objname=]'object_name'[,[@futureonly=]'futureonly_flag']【功能】把默認(rèn)值對(duì)象default綁定到object_name指定的列上或用戶自定義數(shù)據(jù)類型上?!纠繛閟tudentCourse數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)名為Sex_Default的默認(rèn)值對(duì)象,值為“男”。然后把該默認(rèn)值對(duì)象綁定到S表的性別字段上。CREATEDefaultSex_DefaultAs'男'GOEXECsp_bindefault'Sex_Default','S.性別'GOEXECsp_bindefault'Sex_Default','Teachers.性別'GO綁定默認(rèn)對(duì)象—參數(shù)說(shuō)明[@futureonly=]‘futureonly_flag‘選項(xiàng)僅在將默認(rèn)值對(duì)象綁定到用戶定義的數(shù)據(jù)類型時(shí)才使用。將此參數(shù)設(shè)置為futureonly

時(shí),它會(huì)防止現(xiàn)有的屬于此數(shù)據(jù)類型的列采用新的默認(rèn)值。示例【例】如已創(chuàng)建了用戶定義的數(shù)據(jù)類型birthday,且表S中的‘出生日期’字段使用birthday數(shù)據(jù)類型,創(chuàng)建一默認(rèn)值birth_default,取值為“1981-1-1”。然后把該默認(rèn)值對(duì)象綁定到birthday數(shù)據(jù)類型上。--創(chuàng)建了用戶定義的數(shù)據(jù)類型birthday,USEStudentcourseEXECsp_addtypebirthday,datetime,'NOTNULL'--將S表中的‘出生日期’字段修改為birthday數(shù)據(jù)類型altertablesaltercolumn出生日期

birthday--創(chuàng)建一默認(rèn)值birth_default,將它綁定到birthday數(shù)據(jù)類型上CREATEDefaultbirth_DefaultAs'1981-1-1'GOEXECsp_bindefault'birth_Default','birthday'GO--給s表插入一新行,不提供出生日期值,觀察該字段的取值情況??insertintos(學(xué)號(hào),姓名)values('a1234','aaa')Goselect*froms

where學(xué)號(hào)='a1234'當(dāng)某列上同時(shí)定義了default約束、并綁定了默認(rèn)值對(duì)象時(shí),default約束優(yōu)先。分析--若再創(chuàng)建一新默認(rèn)值birth_default2,取值為“1982-1-1”將它綁定birthday數(shù)據(jù)類型上CREATEDefaultbirth_Default2As'1982-1-1'GOEXECsp_bindefault'birth_Default2','birthday'--給s表插入一新行,不提供出生日期值,觀察該字段的取值情況??insertintos(學(xué)號(hào),姓名)values('b1234','bbb')Goselect*froms

where學(xué)號(hào)='b1234'

可以使用sp_bindefault

在不取消現(xiàn)有默認(rèn)值綁定的情況下,將新默認(rèn)值綁定到列或者綁定到用戶定義的數(shù)據(jù)類型,原有默認(rèn)值將被替代。分析--若再創(chuàng)建一新默認(rèn)值birth_default3,取值為“1983-1-1”使用‘futureonly’選項(xiàng)將它綁定birthday數(shù)據(jù)類型上CREATEDefaultbirth_Default3As'1983-1-1'GOEXECsp_bindefault'birth_Default3','birthday','futureonly'--給s表插入一新行,不提供出生日期值,觀察該字段的取值情況??insertintos(學(xué)號(hào),姓名)values('c1234','bbb')Goselect*froms

where學(xué)號(hào)='c1234'分析創(chuàng)建如下teacher數(shù)據(jù)表,其中的出生日期字段使用用戶定義的數(shù)據(jù)類型BIRTHDAY:CREATETABLETeacher

(教師號(hào) CHAR(7)PRIMARYKEY,

姓名 CHAR(10)NOTNULL,

性別CHAR(2)CHECK(性別='男'OR性別='女'),

出生日期BIRTHDAY,

職稱 CHAR(6));--給TEACHER表插入一新行,不提供出生日期值,觀察該字段的取值情況??insertintoTEACHER(教師號(hào),姓名)values(‘t1234',‘ttt')Goselect*fromteacher

where學(xué)號(hào)=‘t1234'

如果默認(rèn)值和要綁定的列不兼容,那么在試圖插入默認(rèn)值時(shí)(不是在綁定時(shí)),SQLServer將返回錯(cuò)誤信息。如:CREATEDefaultScore_DefaultAs

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論