SQLServer總結(jié)
SQLServer總結(jié)
數(shù)據(jù)庫(kù)的設(shè)計(jì)
一、數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程1需求分析階段
2概要設(shè)計(jì)階段3詳細(xì)設(shè)計(jì)階段
二、無(wú)論數(shù)據(jù)庫(kù)大小,在進(jìn)行數(shù)據(jù)庫(kù)的系統(tǒng)分析時(shí),可以參考以下基本步驟1.收集信息創(chuàng)建數(shù)據(jù)庫(kù)之前,必須充分理解數(shù)據(jù)庫(kù)需要完成的任務(wù)和功能2.標(biāo)識(shí)對(duì)象在收集需求信息后,必須標(biāo)識(shí)數(shù)據(jù)庫(kù)要管理的關(guān)鍵對(duì)象成實(shí)體3.標(biāo)識(shí)每個(gè)對(duì)象需要儲(chǔ)存的詳細(xì)信息標(biāo)識(shí)每個(gè)對(duì)象存儲(chǔ)的詳細(xì)信息,也成為該對(duì)象的屬性,這些屬性將組成表中的列4.標(biāo)識(shí)對(duì)象(實(shí)體)之間的關(guān)系關(guān)系型數(shù)據(jù)庫(kù)有一項(xiàng)非常強(qiáng)大的功能,它能夠關(guān)聯(lián)數(shù)據(jù)庫(kù)中各個(gè)項(xiàng)目的相關(guān)信息三、映射基數(shù)
一對(duì)一:X中的一個(gè)實(shí)體最多與Y中的一個(gè)實(shí)體關(guān)聯(lián),并且Y中的一個(gè)實(shí)體最多與X中的一個(gè)實(shí)體關(guān)聯(lián)
一對(duì)多:X中的一個(gè)實(shí)體可以與Y中的任意數(shù)量的實(shí)體關(guān)聯(lián)。Y中的一個(gè)實(shí)體最多與X中的一個(gè)實(shí)體關(guān)聯(lián)
多對(duì)一:X中的一個(gè)實(shí)體最多與Y中的一個(gè)實(shí)體關(guān)聯(lián),而Y中的一個(gè)實(shí)體可以與X中的任意數(shù)量的實(shí)體相關(guān)聯(lián)多對(duì)多:X中的一個(gè)實(shí)體可以與Y中的任意數(shù)量的實(shí)體關(guān)聯(lián),反之亦然。四、實(shí)體關(guān)系圖矩形表示實(shí)體集橢圓形表示屬性
菱形表示關(guān)系集
直線用來(lái)連接屬性和實(shí)體集五、范式設(shè)計(jì)1.第一范式:(1NF,NormalFormate)第一范式的目標(biāo)是確保每列的原子性。2.第二范式:(2NF)
第二范式在第一范式的基礎(chǔ)上,更進(jìn)一層,其目標(biāo)是確保表中的每列都和主鍵相關(guān)聯(lián)。
3.第三范式:(3NF)
第三范式在第二范式的基礎(chǔ)上,更進(jìn)一層,第三范式的目標(biāo)是確保每列都和主鍵列直接相關(guān),而不是間接相關(guān)
在實(shí)際的數(shù)據(jù)庫(kù)設(shè)計(jì)中,既要考慮三大范式,避免數(shù)據(jù)的冗余和各種數(shù)據(jù)操作異常,又要考慮數(shù)據(jù)反問(wèn)性能,有時(shí),為了減少表間連接,提高數(shù)據(jù)庫(kù)的訪問(wèn)性能,允許適當(dāng)?shù)臄?shù)據(jù)冗余列,可能是最適合的數(shù)據(jù)庫(kù)設(shè)計(jì)方案
數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
一、Sql語(yǔ)句戶回顧:
1.添加數(shù)據(jù)
語(yǔ)法:insert[into]表名(字段1,字段2,…..)values(值1,值2,…..)2.修改數(shù)據(jù)
3.語(yǔ)法:update表名set字段1=值1,字段2=值2,…where(條件)4.查詢數(shù)據(jù)
語(yǔ)法:select字段1、字段2,….from表名where(條件)orderby字段名5.刪除數(shù)據(jù)
語(yǔ)法:deletefrom表名where(條件)
二、創(chuàng)建數(shù)據(jù)庫(kù)
a)數(shù)據(jù)庫(kù)名:數(shù)據(jù)庫(kù)的名稱
b)PRIMARY:指定主文件組中的文件
c)LOGON:指明事務(wù)日志文件的明確定義d)NAME:指定數(shù)據(jù)庫(kù)的邏輯名稱
e)FILENAME:指定數(shù)據(jù)庫(kù)所在文件的操作系統(tǒng)名稱和路徑,該操作系統(tǒng)名稱應(yīng)和邏
輯名一一對(duì)應(yīng)
f)SIZE:指定數(shù)據(jù)庫(kù)的初始大小
g)MAXSIZE:指定操作系統(tǒng)文件可以增長(zhǎng)到的最大尺寸h)FILEGROWTH:指定文件每次增加容量的大小三、刪除數(shù)據(jù)庫(kù)
1.語(yǔ)法:
a)dropdatabase數(shù)據(jù)庫(kù)名
b)應(yīng)先用exists檢測(cè)某個(gè)查詢是否存在,如果查詢結(jié)果為空,則表示存在。否則
表示不存在。
四、建表建約束Numeric(18,0)代表18位數(shù)字,小數(shù)位數(shù)是0Identity(1,1)自動(dòng)編號(hào),從1開始遞增,增量是1某個(gè)數(shù)據(jù)庫(kù)中標(biāo)的清單存放在數(shù)據(jù)庫(kù)系統(tǒng)表sysobjects中。1.添加約束
altertable表名addconstraint約束名約束類型具體的約束說(shuō)明2.刪除約束
dropconstraint約束名
四、賬戶
a)創(chuàng)建登陸賬戶
execsp_addlogin‘zhangsan’,’1234’b)創(chuàng)建數(shù)據(jù)庫(kù)用戶
execsp_grantdbaccess‘賬戶名\\密碼’,‘?dāng)?shù)據(jù)庫(kù)名’execsp_grantdbaccess‘賬戶名’,’密碼grant權(quán)限[on表名]to數(shù)據(jù)庫(kù)用戶
T-SQL編程
一、使用變量
a)局部
declare@variable_nameDataType賦值:
set@variable_name=value
或select@variable_name=value
set賦值語(yǔ)句一般用于賦給變量指定的數(shù)據(jù)常量
select賦值語(yǔ)句一般用于從表中查詢數(shù)據(jù),然后再賦給變量b)全局變量
i.@@ERROR最后一個(gè)T-SQL錯(cuò)誤的錯(cuò)誤號(hào)ii.@@IDENTITY最后一次插入的標(biāo)示符iii.@@SERVERNAME本地服務(wù)器的名稱iv.@@SERVICENAME該計(jì)算機(jī)上的SQL的服務(wù)名稱v.@@VERSIONSQLServer的版本信息c)輸出語(yǔ)句
i.print局部變量或字符串ii.select局部變量as自定義列名查詢語(yǔ)句的特殊應(yīng)用iii.print‘當(dāng)前錯(cuò)誤號(hào)’+conver(varchar(2),@@ERROR)和字符串一起輸出需要轉(zhuǎn)換
二、邏輯控制語(yǔ)句
a)If-else
if(條件)begin語(yǔ)句1語(yǔ)句2…..endelse…….b)While
while(條件)語(yǔ)句或語(yǔ)句塊[break]
使用break關(guān)鍵字從最內(nèi)層的while循環(huán)中退出c)Case
case
when條件1then結(jié)果1when條件2then結(jié)果2[else其他結(jié)果]endd)批處理
i.go是批處理語(yǔ)句結(jié)束的標(biāo)志ii.是一條或多條sql語(yǔ)句的集合,sqlserver將批處理語(yǔ)句變異成一個(gè)可執(zhí)行單元,
此單元成為執(zhí)行計(jì)劃,每個(gè)批處理可以編譯成單個(gè)執(zhí)行計(jì)劃,從而提高執(zhí)行效率iii.Sqlserver規(guī)定:如果是創(chuàng)建庫(kù)、創(chuàng)建表語(yǔ)句,以及創(chuàng)建視圖和存儲(chǔ)過(guò)程等,
則必須在語(yǔ)句末尾添加“GO”批處理標(biāo)志
高級(jí)查詢
一、子查詢
a)一般子查詢
一般來(lái)說(shuō),表連接都可以用字查詢替換,但反過(guò)來(lái)說(shuō)卻不一定。有的子查詢不能用表連接來(lái)代替,子查詢比較靈活、方便、形式多樣,適合于作為查詢的篩選條件,而表連接更適合于查看多表的數(shù)據(jù)b)in和notin子查詢
使用“=”、“>”等比較運(yùn)算符時(shí),要求子查詢只能返回一條或空的記錄,那么我們可以將“=”改為“in”c)exists和notexists子查詢
從理論上講,exists也可以作為where語(yǔ)句的子查詢,但一般用于if語(yǔ)句的存在檢測(cè)語(yǔ)法:ifexists(子查詢)語(yǔ)句
如果子查詢的結(jié)果非空,則exists(子查詢)將返回真(true),否則返回假(false)
事務(wù)、索引和視圖
一、事務(wù)
事務(wù)是一種機(jī)制、一個(gè)操作序列,它包含了一組數(shù)據(jù)庫(kù)操作命令,并且所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這一組數(shù)據(jù)庫(kù)命令要么都執(zhí)行,要么都不執(zhí)行,因此事務(wù)是一個(gè)不可分割的工作邏輯單元事務(wù)特性
1.原子性(Atomicity):事務(wù)是一個(gè)完整的操作2.一致性(Consistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)3.隔離性(Isolation):對(duì)數(shù)據(jù)進(jìn)行修改的所有井發(fā)事務(wù)是彼此隔離的4.持久性(Durability):事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的
創(chuàng)建事務(wù):開始事務(wù):begintransaction提交事務(wù):committransaction回滾(撤銷)事務(wù):rollbacktransaction三、索引.通過(guò)搜索索引找到特定的值,然后跟隨指針到達(dá)包含該值的行.通過(guò)使用索引,可以大大提高數(shù)據(jù)庫(kù)的檢索速度,改善數(shù)據(jù)庫(kù)性能
.創(chuàng)建了唯一索引約束,將自動(dòng)創(chuàng)建唯一索引,盡管唯一索引有助于找到信息,但為了獲得最佳性能,建議使用主鍵約束。
.在SQLServer中,一個(gè)表只能創(chuàng)建一個(gè)聚集索引,但可以有多個(gè)非聚集索引,設(shè)置某列為主鍵,該列就默認(rèn)為聚集索引。1.如何創(chuàng)建索引
a)使用MicrosoftSQLServerManagementStudio創(chuàng)建索引b)使用T-SQL語(yǔ)句創(chuàng)建索引
i.UNIQUE指定唯一索引,可選ii.CLUSTERED、NONCLUSTERED指定是聚集索引還是非聚集索引,可選iii.FILLFACTOR表示填充因子,指定一個(gè)0~100的值,該值只是索引頁(yè)填滿的
空間所占的百分比
2.優(yōu)點(diǎn):
a)加快訪問(wèn)速度b)加強(qiáng)行的唯一性3.確定
a)帶索引的表在數(shù)據(jù)庫(kù)中需要更多的存儲(chǔ)空間
四、視圖
a)視圖是另一種查看數(shù)據(jù)庫(kù)中一個(gè)或多個(gè)表中的數(shù)據(jù)的方法,視圖是一種虛擬表,通
常是作為來(lái)自一個(gè)或多個(gè)表的行或列的自己創(chuàng)建的。
b)理論上它可以向普通的物理表一樣使用,例如增加、刪除、修改、查詢等,修改視
圖實(shí)際上是修改原始數(shù)據(jù)表,因?yàn)樾薷囊晥D有許多限制,所以在實(shí)際開發(fā)中一般視圖僅用做查詢使用
存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程優(yōu)點(diǎn):
a)允許模塊化程序設(shè)計(jì)b)允許更快地執(zhí)行c)減少網(wǎng)絡(luò)流量
d)可作為安全機(jī)制使用存儲(chǔ)過(guò)程可以分為兩類:
1)系統(tǒng)存儲(chǔ)過(guò)程
2)用戶自定義的存儲(chǔ)過(guò)程
一、常用的系統(tǒng)存儲(chǔ)過(guò)程:
a)系統(tǒng)存儲(chǔ)過(guò)程的名稱都以”sp_”開頭,并放在master數(shù)據(jù)庫(kù)中。
sp_databases:列出服務(wù)器上的所有數(shù)據(jù)庫(kù)
sp_helpdb:報(bào)告有關(guān)指定數(shù)據(jù)庫(kù)或所有數(shù)據(jù)庫(kù)的信息sp_renamedb:更改數(shù)據(jù)庫(kù)的名稱
sp_tables:返回當(dāng)前環(huán)境下可查詢的對(duì)象的列表sp_columns:返回某個(gè)列表的信息sp_help:查看某個(gè)表的所有信息
sp_stored_procedures:列出當(dāng)前環(huán)境中的所有存儲(chǔ)過(guò)程b)在MicrosoftSqlserverManagermentStudio中一般不能修改數(shù)據(jù)庫(kù)的名稱,但可以
通過(guò)在新建查詢中調(diào)用sp_renamedb系統(tǒng)存儲(chǔ)過(guò)程來(lái)修改execxp_cmdshelldos命令[NO_OUTPUT]
二、用戶定義的存儲(chǔ)過(guò)程
a)用于創(chuàng)建存儲(chǔ)過(guò)程的T-SQL語(yǔ)句為createprocedure。b)語(yǔ)法:
createproc[edure]存儲(chǔ)過(guò)程名字[
{@參數(shù)1數(shù)據(jù)類型}[=默認(rèn)值][output],…..,
{@參數(shù)n數(shù)據(jù)類型}[=默認(rèn)值][output]]
調(diào)用:
Exec存儲(chǔ)過(guò)程名【參數(shù)】
三、處理錯(cuò)誤信息
RAISERROR返回用戶定義的錯(cuò)誤信息時(shí),可以指定嚴(yán)重級(jí)別,設(shè)置系統(tǒng)變量記錄發(fā)生的錯(cuò)誤語(yǔ)法:
raiserror({msg_id|msg_str}{,severity,state}[withoption[,…n]])msg_id:在sysmessage系統(tǒng)表中指定的用戶定義錯(cuò)誤信息msg_id:用戶定義的特定信息,最長(zhǎng)255個(gè)字符
severity:與特定信息相關(guān)聯(lián),表示用戶定義的嚴(yán)重新級(jí)別。state:表示錯(cuò)誤的狀態(tài)
option:只是是否將錯(cuò)誤記錄到服務(wù)器錯(cuò)誤日志中
擴(kuò)展閱讀:SQL Server知識(shí)點(diǎn)總結(jié)
第一章關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)基礎(chǔ)知識(shí)
1.1數(shù)據(jù)庫(kù)系統(tǒng)概述
數(shù)據(jù):對(duì)客觀存在的事物的一種描述。
數(shù)據(jù)庫(kù):長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)、與應(yīng)用程序彼此獨(dú)立的、以一定的組織方式存儲(chǔ)在一起的、彼此相互關(guān)聯(lián)的、具有較少冗余的、能被多個(gè)用戶共享的數(shù)據(jù)集合。數(shù)據(jù)庫(kù)體系結(jié)構(gòu):
(1)內(nèi)模式:也稱存儲(chǔ)模式,是數(shù)據(jù)庫(kù)全部數(shù)據(jù)的內(nèi)部表示或者底層描述,用來(lái)定義數(shù)據(jù)的存儲(chǔ)方式和物理結(jié)構(gòu)。
(2)模式:也稱邏輯模式,實(shí)際上是數(shù)據(jù)在邏輯級(jí)上的視圖,是數(shù)據(jù)庫(kù)中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征描述,即根據(jù)用戶需求設(shè)計(jì)出的數(shù)據(jù)庫(kù)模型。
(3)外模式:也稱用戶模式,是數(shù)據(jù)庫(kù)用戶能夠看見和使用的數(shù)據(jù)視圖。
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)是位于用戶與計(jì)算機(jī)操作系統(tǒng)之間的一個(gè)系統(tǒng)軟件,由一組計(jì)算機(jī)程序組成。DBMS的功能:
數(shù)據(jù)定義功能:DDL
數(shù)據(jù)操作功能:DML分為:交互式命令語(yǔ)言、嵌入式語(yǔ)言。數(shù)據(jù)庫(kù)的運(yùn)行與管理,包括數(shù)據(jù)安全控制、數(shù)據(jù)完整性控制、數(shù)據(jù)庫(kù)的恢復(fù)、并發(fā)控制。數(shù)據(jù)的建立和維護(hù)功能。初始數(shù)據(jù)的輸入與數(shù)據(jù)轉(zhuǎn)換等。數(shù)據(jù)通信接口:與其它軟件系統(tǒng)通信的功能。
1.2數(shù)據(jù)模型
數(shù)據(jù)模型分三大類:
概念數(shù)據(jù)模型:獨(dú)立于計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)模型,完全不涉及信息在計(jì)算機(jī)系統(tǒng)中的表
示,只是用來(lái)描述所使用的信息結(jié)構(gòu)。
邏輯數(shù)據(jù)模型:返回?cái)?shù)據(jù)的邏輯結(jié)構(gòu),主要有層次數(shù)據(jù)模型、網(wǎng)狀數(shù)據(jù)模型、關(guān)系數(shù)
據(jù)模型。
物理數(shù)據(jù)模型:反映數(shù)據(jù)在計(jì)算機(jī)中的存儲(chǔ)結(jié)構(gòu)。
1.2.1數(shù)據(jù)模型的組成要素:
數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)操作
數(shù)據(jù)的完整性約束條件
1.2.2概念模型
(一)實(shí)體及其屬性
(1)實(shí)體:現(xiàn)實(shí)世界客觀存在并且可以相互區(qū)分的事物稱為實(shí)體。(2)屬性:實(shí)體所具有的某一特性稱為屬性。
(3)型與值:型,是結(jié)構(gòu),用實(shí)體名及屬性名集合描述同類實(shí)體,稱為實(shí)體型。值,是數(shù)據(jù),不同的實(shí)體有不同的屬性內(nèi)容。
(4)實(shí)體集:具有相同實(shí)體型的實(shí)體值的集體合為實(shí)體集。
(5)關(guān)鍵字:能區(qū)別實(shí)體集合中不同個(gè)體的某一個(gè)或某幾個(gè)屬性的集合。(二)實(shí)體間的關(guān)系:(1)一對(duì)一(1:1)(2)一對(duì)多(1:N)(3)多對(duì)多(N:M)
(三)概念模型的表示方法
E-R圖(1)實(shí)體型(2)屬性(3)聯(lián)系
1.2.5關(guān)系模型
(一)基本術(shù)語(yǔ)
(1)關(guān)系:一個(gè)關(guān)系模型的邏輯結(jié)構(gòu)是二維表,它由行和列組成。(2)元組:表中的一行稱為一個(gè)元組,也稱為記錄。(3)屬性:表中的一列稱為屬性,用來(lái)描述事物的特征。(4)域:屬性的取值范圍。
(5)關(guān)系字/碼:在關(guān)系中某一個(gè)屬性或?qū)傩越M的值唯一的決定其他所有屬性。
(6)候選鍵/候選關(guān)鍵字/候選碼:一個(gè)關(guān)系中有多個(gè)屬性或?qū)傩越M都能用來(lái)標(biāo)識(shí)關(guān)系的元組。
(7)主鍵/關(guān)關(guān)系字/主碼:在一個(gè)關(guān)系的多個(gè)候選碼中指定其中一個(gè)作為該關(guān)系的關(guān)鍵字。(8)外鍵/外關(guān)系字/外碼:(二)關(guān)系模型的三要素(1)數(shù)據(jù)結(jié)構(gòu)關(guān)系(2)關(guān)系操作
(3)關(guān)系完整性約束(三)關(guān)系模型的特點(diǎn)(1)嚴(yán)格的理論基礎(chǔ)(2)數(shù)據(jù)結(jié)構(gòu)單一(3)存取簡(jiǎn)單
1.3關(guān)系數(shù)據(jù)庫(kù)及其設(shè)計(jì)過(guò)程1.3.1關(guān)系與表格
表應(yīng)該具有的性質(zhì):(1)必須是規(guī)范化的關(guān)系(2)表中的“行”是惟一的(3)行的次序可以任意
(4)表中的確良“列名”是惟一的(5)列的次序可以任意(6)必須滿足完整性約束
1.3.3數(shù)據(jù)設(shè)計(jì)過(guò)程
(1)需要分析(2)概念結(jié)構(gòu)設(shè)計(jì)
(3)邏輯結(jié)構(gòu)設(shè)計(jì)(E-R模型到關(guān)系模型)
(4)物理結(jié)構(gòu)設(shè)計(jì)(確定數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)、索引結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)存儲(chǔ)位置的考慮、系統(tǒng)配置的優(yōu)化)
(5)數(shù)據(jù)庫(kù)實(shí)施(定義數(shù)據(jù)庫(kù)結(jié)構(gòu)、數(shù)據(jù)裝載)(6)數(shù)據(jù)庫(kù)的運(yùn)行和維護(hù)(維護(hù)數(shù)據(jù)庫(kù)的安全性和完整性、數(shù)據(jù)庫(kù)的轉(zhuǎn)儲(chǔ)和恢復(fù)、臨測(cè)并改善數(shù)據(jù)性能、數(shù)據(jù)庫(kù)的重新組織)
1.4關(guān)系數(shù)據(jù)的規(guī)范化1.4.1數(shù)據(jù)庫(kù)的三個(gè)規(guī)范化形式
(一)第一規(guī)范化形式1NF
在一個(gè)關(guān)系(數(shù)據(jù)表)中沒有重復(fù)的數(shù)據(jù)項(xiàng),每個(gè)屬性都是不可分割的最小數(shù)據(jù)元素。即每列的列名都是惟一的,一個(gè)關(guān)系中不允許有兩個(gè)相同的屬性名,同一列的數(shù)據(jù)具有相同的數(shù)據(jù)類型,列的順序交換不能改變關(guān)系的實(shí)際意義。沒有相同的的列字段惟一。商品名稱商品名進(jìn)貨數(shù)據(jù)數(shù)量單價(jià)銷售數(shù)據(jù)數(shù)據(jù)單價(jià)庫(kù)存數(shù)據(jù)備注數(shù)量數(shù)量(二)第二規(guī)范化形式2NF
在滿足1NF的關(guān)系中,一行中所有非關(guān)鍵字?jǐn)?shù)據(jù)元素都完全依整于關(guān)系字。即一個(gè)關(guān)系中不允許有兩個(gè)相同的實(shí)體,行的順序交換后不能改變數(shù)據(jù)表的實(shí)際意義。即數(shù)據(jù)表中沒有相同的行
(三)第三規(guī)范化形式3NF
滿足2NF的關(guān)系中,不存在傳遞依賴于關(guān)系字的數(shù)據(jù)項(xiàng)。傳遞依賴:指某些列的數(shù)據(jù)不是直接依賴于關(guān)鍵字,而是通過(guò)某個(gè)非關(guān)系字間接地依賴于關(guān)鍵字。將不依賴關(guān)鍵字的列刪除,單獨(dú)創(chuàng)建一個(gè)數(shù)據(jù)表存儲(chǔ)。
1.4.2數(shù)據(jù)規(guī)范化設(shè)計(jì)的原則
(1)保證數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)表都滿足2NF,力求絕大多烽數(shù)據(jù)表滿足3NF(2)保存數(shù)據(jù)的完整性(3)盡可能減少冗余
1.5數(shù)據(jù)表的關(guān)聯(lián)與數(shù)據(jù)的完整性1.5.1表的關(guān)系
(一)交叉連接
也稱為非限制連接、無(wú)條件連接或笛卡兒連接。將兩個(gè)表不加任何限制地組合在一起,其連接方法是將第一表中的每條記錄分別與第二個(gè)表中每條記錄連接成一條新記錄,結(jié)果是具有兩個(gè)記錄數(shù)乘職的邏輯數(shù)據(jù)表。學(xué)號(hào)1001100210031004
姓名呂川頁(yè)鄭學(xué)敏于麗孫立華
學(xué)號(hào)100310041005成績(jī)9278學(xué)號(hào)100110011001100210021002100310031003100410041004姓名呂川頁(yè)呂川頁(yè)呂川頁(yè)鄭學(xué)敏鄭學(xué)敏鄭學(xué)敏于麗于麗于麗孫立華孫立華孫立華學(xué)號(hào)100310041005100310041005100310041005100310041005成績(jī)927885927885927885927885(二)內(nèi)連接:也稱為自然連接,只將兩個(gè)表中滿足指定條件的記錄連接成一條新記錄,舍棄所有不滿足條件沒有連接的記錄學(xué)號(hào)10031004姓名于麗孫立華學(xué)號(hào)10031004成績(jī)9278
等價(jià)于
學(xué)號(hào)10031004姓名于麗孫立華成績(jī)9278(三)外連接
可以只限制一個(gè)表,對(duì)另外一個(gè)表不加限制(所有行都出現(xiàn)在結(jié)果集中),以便在結(jié)果集中保證該的完整性。
外連接分為左外連接、右外連接、全外連接
(1)左外連接:可以得到左表的全部記錄及右表相關(guān)的記錄信息。學(xué)號(hào)1001100210031004學(xué)號(hào)10031004Null學(xué)號(hào)1001100210031004Null姓名呂川頁(yè)鄭學(xué)敏于麗孫立華姓名于麗孫立華Null姓名呂川頁(yè)鄭學(xué)敏于麗孫立華Null學(xué)號(hào)NullNull10031004學(xué)號(hào)100310041005學(xué)號(hào)NullNull100310041005成績(jī)NullNull9278成績(jī)927885成績(jī)NullNull927885等價(jià)于等價(jià)于
等價(jià)于
學(xué)號(hào)1001100210031004學(xué)號(hào)10031004Null學(xué)號(hào)1001100210031004Null姓名呂川頁(yè)鄭學(xué)敏于麗孫立華姓名于麗孫立華Null姓名呂川頁(yè)鄭學(xué)敏于麗孫立華Null成績(jī)NullNull9278成績(jī)927885成績(jī)NullNull927885(2)右外連接:可以得到右表的全部記錄信息及左表相關(guān)的記錄信息。(3)全外連接:可以得到左表與右表的全部記錄信息。1.5.2數(shù)據(jù)的完整性及約束(1)數(shù)據(jù)完整性
1)實(shí)體完整性:數(shù)據(jù)表中的所有行都是惟一的、確定的,所有記錄都是可以區(qū)分的。表中的主鍵值惟一,主要屬性不能為空,主鍵不能為空。
2)參照完整性:定義外鍵與主鍵之間的引用規(guī)則,確保數(shù)據(jù)庫(kù)中不會(huì)含有無(wú)效外鍵。當(dāng)一個(gè)表中的某列數(shù)據(jù)依賴引用另一個(gè)表的某列數(shù)據(jù)時(shí),這兩個(gè)表之間的相關(guān)數(shù)據(jù)必須保持一致。3)域完整性:表中每列的數(shù)據(jù)具有正確的數(shù)據(jù)類型、格式和有效的取值范圍,保證數(shù)據(jù)的正確性。(2)約束
1)主鍵約束:每個(gè)表必須設(shè)計(jì)主鍵約束,主鍵的特點(diǎn):不允許重復(fù)、不允許為空、只能有一主鍵,可以是聯(lián)合主鍵。記錄按主鍵值指定順序存儲(chǔ)。
2)惟一約束:一列數(shù)據(jù)或幾列數(shù)據(jù)的組合值在數(shù)據(jù)表中是惟一不能重復(fù)的。保證主鍵外的字段值不能重復(fù)。一個(gè)表中可以定義多個(gè)惟一約束?梢栽试S為空值。
3)外鍵約束:如果一個(gè)表中某個(gè)字段的數(shù)據(jù)只能取另一個(gè)表中某個(gè)字段值之一,則必須為該字段設(shè)置外鍵約束,設(shè)置外鍵約束的表稱為子表,它所引用的表稱為父表。外鍵約束可以使一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)數(shù)據(jù)表之間建立關(guān)系。建立一對(duì)多的邏輯關(guān)系。外鍵約束可以保證數(shù)據(jù)的參照完整性和域完整性。
外鍵約束的特點(diǎn):可以是單一字段,也可以是多個(gè)字段的組合;外鍵所引用父表中的字段必須是創(chuàng)建了主鍵約束或惟一約束的列;外鍵可以允許空值,可以有重復(fù)值,但必須是父表引用列中的數(shù)據(jù)之一;子表中外鍵字段添加的新數(shù)據(jù),必須先在父表中添加,再在子表中添加;子表中引用父表數(shù)據(jù)的記錄未刪除,則父表中被引用的數(shù)據(jù)不能被刪除。
4)檢查約束:用指定的條件檢查限制輸入數(shù)據(jù)的取值范圍是否正確,用以保證數(shù)據(jù)的參照完整性和域完整性。
5)默認(rèn)值約束:指給某個(gè)字段一個(gè)默認(rèn)的初始值,輸入記錄時(shí)若沒有給出該字段的數(shù)據(jù),則自動(dòng)填入默認(rèn)值以保證數(shù)據(jù)的域完整性。
6)空值約束:指不知道或不能確定的特殊數(shù)據(jù),不等同于數(shù)據(jù)0和字符的空格。設(shè)置某個(gè)字段的值是否允許為空。用以保證數(shù)據(jù)的參照完整性和域完整性。
習(xí)題:
(1)關(guān)系數(shù)據(jù)模型中,實(shí)體用(巨型)來(lái)表示,實(shí)體間的聯(lián)系用(菱形)來(lái)表示
(2)(DBMS)是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件。數(shù)據(jù)庫(kù)在建立、使用和維護(hù)時(shí)是由其統(tǒng)一管理、統(tǒng)一控制。
(3)目前最常用的數(shù)據(jù)模型有(層次模型)、(網(wǎng)狀模型)、(關(guān)系模型).20世紀(jì)80年代以來(lái),(關(guān)系模型)逐漸占主導(dǎo)地位。
(4)數(shù)據(jù)模型的三要要素包括(數(shù)據(jù)結(jié)構(gòu))、(數(shù)據(jù)操作)和(數(shù)據(jù)的完整性約束條件).(5)關(guān)系的主鍵是()、外鍵是()
(6)數(shù)據(jù)庫(kù)的實(shí)體完整性要求表中的所有(行)惟一,可以通過(guò)創(chuàng)建(主鍵約束)(惟一約束)(空值)等約束來(lái)實(shí)現(xiàn)
(7)數(shù)據(jù)的參照完整性要有關(guān)聯(lián)的兩個(gè)或兩個(gè)以上數(shù)據(jù)表之間的數(shù)據(jù)(保持一致)數(shù)據(jù)庫(kù)參照完整性可通過(guò)創(chuàng)建(外鍵約束)和(檢查約束)約束來(lái)實(shí)現(xiàn)
(8)數(shù)據(jù)庫(kù)域完整性可保證表中指定字段中數(shù)據(jù)的(正確性).要求表中指定列的數(shù)據(jù)具有正確的(數(shù)據(jù)類型)(格式)和(有效的取值范圍).
(9)在一個(gè)表上能創(chuàng)建(一)個(gè)主鍵約束,主鍵值(不允許)為空,在一個(gè)表上能健(多)個(gè)惟一約束,惟一值(允許)為空
(10)外鍵約束來(lái)用創(chuàng)建立兩個(gè)表之間的關(guān)聯(lián)。外鍵列的取值可以(空),可以有(重復(fù))值,但其值必須是引用列的值之一。引用列必須是創(chuàng)建了(主鍵)或(惟一)的列。
(11)若為某公司開發(fā)一個(gè)邏輯模型:公司有10個(gè)部門,每個(gè)部門有67個(gè)員工,但每個(gè)員工可能會(huì)在不止一個(gè)部門工作。下面所給的模型正確的是(B).A.部門和員工之間是一種確定的一對(duì)多的關(guān)系。
B.建立一個(gè)關(guān)聯(lián)表,從該關(guān)聯(lián)表到員工建立一個(gè)一對(duì)多的關(guān)系,然后再?gòu)脑撽P(guān)聯(lián)表到部門表建立一個(gè)一對(duì)多的關(guān)系。
C.建立一個(gè)關(guān)聯(lián)表,從員工表到該關(guān)聯(lián)建立一個(gè)一對(duì)多的關(guān)系,然后再?gòu)牟块T表到該關(guān)聯(lián)表建立一個(gè)一對(duì)多的關(guān)系。
D.這種情況不能建立正常的數(shù)據(jù)庫(kù)型。
(12)假設(shè)有一個(gè)學(xué)生信息表(StuInfo)的設(shè)計(jì)如下:StuId,Name,Address,Departmetn,DepartmentHead該最高滿足第(2NF)范式。(13)指出下列關(guān)系各屬第幾范式。
(1)學(xué)生(學(xué)號(hào),姓名,課程號(hào),成績(jī))(2NF)(2)學(xué)生(學(xué)號(hào),姓名,性別)(3NF)
(3)學(xué)生(學(xué)號(hào),姓名,所在系另,所在系地址)(2NF)
(4)員工(員工編號(hào),基本工資,崗位級(jí)別,崗位工資,獎(jiǎng)金,工資總額)(2NF)(5)供貨商(供貨商編號(hào),零件號(hào),零件名,單價(jià),數(shù)量)(2NF)
第二章SqlServer201*數(shù)據(jù)庫(kù)管理系統(tǒng)
1.SQLServer201*的各種版本(1)SQLServer201*企業(yè)版(2)SQLServer201*標(biāo)準(zhǔn)版(3)SQLServer201*個(gè)人版(4)SQLServer201*開發(fā)版
(5)SQLServer201*WindowsCE版(6)SQLServer201*企業(yè)評(píng)估版2.SQLServer201*的用戶帳號(hào)(1)使用本地系統(tǒng)帳號(hào)
(2)使用域用戶帳號(hào)(必須是Administrators組的成員、有密碼永不過(guò)期的屬性、作為一個(gè)服務(wù)登錄)
3.SQLServer201*的組件
(1)服務(wù)器組件(2)管理工具(3)客戶端連接(4)聯(lián)機(jī)叢書(5)工發(fā)工具(6)代碼示例4.SQLServer提供的服務(wù)
(1)SQLServer服務(wù):實(shí)現(xiàn)SQLServer數(shù)據(jù)庫(kù)引擎,處理所有T-SQL語(yǔ)句,管理服務(wù)器上數(shù)據(jù)庫(kù)的所有文件,在多個(gè)并發(fā)用戶之間分配計(jì)算機(jī)資源,防止產(chǎn)生邏輯問(wèn)題,保證數(shù)據(jù)的安全性、一致性和完整性。
(2)SQLServer代理服務(wù):實(shí)現(xiàn)運(yùn)行調(diào)度的SQLServer管理任務(wù)的代理程序。SQLServer代理是一個(gè)任務(wù)規(guī)劃器和警報(bào)管理器?梢詣(chuàng)建和管理作業(yè)、警報(bào)和操作員。
(3)Microsoft搜索服務(wù):僅用于WindowsNT和Windows201*,實(shí)現(xiàn)全文本檢索引擎。
(4)MSDTC(DistributedTransactionCoordinator)服務(wù):僅用于WindowsNT和Windows201*,管理分布式事務(wù)。
2.4SQLServer201*的系統(tǒng)數(shù)據(jù)庫(kù)及系統(tǒng)表(1)系統(tǒng)數(shù)據(jù)庫(kù)
1)master數(shù)據(jù)庫(kù):記錄了SQLServer系統(tǒng)級(jí)的信息,包括系統(tǒng)中所有登錄帳號(hào)、系統(tǒng)配置信息、所有數(shù)據(jù)庫(kù)的信息以及所有用戶數(shù)據(jù)庫(kù)的主文件地址等。Master數(shù)據(jù)庫(kù)中還有很多系統(tǒng)存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。
2)tempdb數(shù)據(jù)庫(kù):用于存儲(chǔ)所有連接到系統(tǒng)的用戶臨時(shí)表和臨時(shí)存儲(chǔ)過(guò)程以及SQLServer產(chǎn)生的其他臨時(shí)性的對(duì)象。Tempdb是SQLServer中負(fù)擔(dān)最重的數(shù)據(jù)庫(kù),因?yàn)閹缀跛胁樵兌夹枰褂盟jP(guān)閉SQLServer時(shí),tempdb數(shù)據(jù)庫(kù)中所有對(duì)象會(huì)被刪除。
3)model數(shù)據(jù)庫(kù):是系統(tǒng)所有數(shù)據(jù)庫(kù)的模板,這個(gè)數(shù)據(jù)庫(kù)相當(dāng)一個(gè)模子,所有在系統(tǒng)中創(chuàng)建的新數(shù)據(jù)庫(kù)的內(nèi)容,在剛創(chuàng)建時(shí)都和model數(shù)據(jù)庫(kù)完全一樣。
4)msdb數(shù)據(jù)庫(kù):被SQLServer代理來(lái)安排報(bào)警、作業(yè),并記錄操作員。(2)系統(tǒng)表
1)Sysdatabases:記錄系統(tǒng)數(shù)據(jù)庫(kù)和用戶自定義數(shù)據(jù)庫(kù),只在master表。2)Syslogins:只在mastetr表,記錄每一個(gè)登錄帳號(hào)
3)Syslanguages:只在master表,記錄每種語(yǔ)言,美國(guó)英語(yǔ)不表中。
4)Sysobjects:在每個(gè)表中,記錄創(chuàng)建的每一個(gè)對(duì)象。在tempdb表中,每個(gè)臨時(shí)表被記錄。5)Syscolumns:每個(gè)表中,對(duì)基表或者視圖的每一個(gè)列和存儲(chǔ)過(guò)程中的每個(gè)參數(shù)。
6)Sysindexes:每個(gè)表中,記錄每個(gè)索引和沒有聚簇索引的每個(gè)表含有的一行記錄,還包括文本或圖像數(shù)據(jù)。
7)Sysusers在每個(gè)表中,記錄整個(gè)數(shù)據(jù)庫(kù)中的每個(gè)NT用戶,NT用戶組、SQLServer用戶或者SQLServer角色。
8)Sysdepends:記錄表、視圖、和存儲(chǔ)過(guò)程之間每一個(gè)依賴關(guān)系。9)Sysforeignkeys:包含關(guān)系表中的外鍵約束。10)Sysfiles:記錄每一個(gè)文件。
2.5SQL和T-SQL概述
T-SQL的分類:
(1)數(shù)據(jù)定義語(yǔ)句:用來(lái)定義和管理數(shù)據(jù)以及數(shù)據(jù)庫(kù)中的各種對(duì)象的語(yǔ)句。Create,Aler,Drop.(2)數(shù)據(jù)操作語(yǔ)句:用來(lái)查詢、添加、修改和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)語(yǔ)句。Select,Insert,Update,Delete.
(3)數(shù)據(jù)控制語(yǔ)句:用來(lái)進(jìn)行安全管理,以確保數(shù)據(jù)庫(kù)中數(shù)據(jù)和操作不被未授僅用戶使用和執(zhí)行。Grant,Deny,Revoke.
(4)附加的語(yǔ)言元素:為了編寫腳本而增加的語(yǔ)言元素,包括變量、運(yùn)算符、函數(shù),流程控制和注釋。
習(xí)題:
(1)服務(wù)管理是用來(lái)(啟動(dòng))(停止)和(暫停),SQLServer服務(wù)的。這些服務(wù)在WindowsNT或Windows201*下也可以通過(guò)控制面板的[服務(wù)]項(xiàng)來(lái)啟動(dòng)或停止。
(2)在[開始]菜單的MicrosoftSQLServer程序中選擇EnterpriseManager即可啟動(dòng)(???)管理器
(3)在[查詢]窗口中用戶可以輸入SQL語(yǔ)句,按(F5)鍵,或單擊工具欄上的[運(yùn)行]按鈕,將其送到服務(wù)器執(zhí)行。
第三章用戶數(shù)據(jù)庫(kù)的創(chuàng)建與操作
3.1SQLServer數(shù)據(jù)庫(kù)的存儲(chǔ)結(jié)構(gòu)3.1.1SQLServer數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)名:
由字母、數(shù)字、漢字、下劃線組成。不能以數(shù)字開頭,不能是關(guān)鍵字不能超過(guò)128個(gè)字符
3.1.2數(shù)據(jù)庫(kù)文件的分類
(1)數(shù)據(jù)庫(kù)文件(課后題3,4)分三類:
主數(shù)據(jù)文件:.MDF有且只能一個(gè)。存儲(chǔ)數(shù)據(jù)和啟動(dòng)信息。輔助數(shù)據(jù)文件:.NDF0或多個(gè)。存儲(chǔ)數(shù)據(jù)
事務(wù)日志文件:LDF1或多個(gè)。存儲(chǔ)對(duì)數(shù)據(jù)庫(kù)的操作、修改信息。(2)文件組:將多個(gè)數(shù)據(jù)庫(kù)文件組成一個(gè)文件組,整體管理。
無(wú)論一個(gè)數(shù)據(jù)庫(kù)有多少個(gè)數(shù)據(jù)文件,也無(wú)論多少個(gè)文件組,主數(shù)據(jù)文件只能有一個(gè)。默認(rèn)組名:Primary
數(shù)據(jù)文件和文件組的規(guī)則:
一個(gè)文件或文件組包括事務(wù)日志文件只能被一個(gè)數(shù)據(jù)庫(kù)使用。一個(gè)數(shù)據(jù)文件只能屬于一個(gè)文件組。事務(wù)日志文件不屬于文件組。
3.1.3數(shù)據(jù)庫(kù)對(duì)象
數(shù)據(jù)庫(kù)對(duì)象沒有對(duì)應(yīng)的磁盤文件。
表、視圖、存儲(chǔ)過(guò)程、觸發(fā)器、用戶定義類型、用戶定義函數(shù)、索引、規(guī)則、默認(rèn)、全文目錄、約束
3.2創(chuàng)建數(shù)據(jù)庫(kù)3.2.1用企業(yè)管理器創(chuàng)建
文件大。撼跏既萘(MB),默認(rèn)1MB
主數(shù)據(jù)庫(kù)文件默認(rèn)組primary不可更改(可修改系統(tǒng)設(shè)置)文件自動(dòng)增加分為:按兆字節(jié)和按百分比
3.2.2用CreateDataBase語(yǔ)句
createdatabaseteacheron(name=teacherdate1,filename="F:\\SqlTest\\tdata1.mdf",size=1MB,--默認(rèn)字節(jié),可以省略,maxsize=10,--最大容量filegrowth=15%--增長(zhǎng)量),(name=teacherdata2,filename="F:\\Sqltest\\tdata2.ndf",size=2MB,maxsize=15,filegrowth=2)logon(name=teacherlog,filename="F:\\Sqltest\\tlog.ldf",size=500MB,--初始容量,KB為單位,不能省略。maxsize=unlimited,--最大容量不受限制。filegrowth=500kb--增加量不能省略.)說(shuō)明:路徑必須得存在3.3.2用T-SQL查看數(shù)據(jù)庫(kù)信息
(1)execsp_helpdb--顯示所有數(shù)據(jù)庫(kù)信息
(2)execsp_helpdbteacher--顯示指定數(shù)據(jù)庫(kù)信息
(3)execsp_databases所有數(shù)據(jù)庫(kù)信息,沒有sp_helpdb內(nèi)容多。(4)execsp_helpfile--當(dāng)前數(shù)據(jù)庫(kù)信息(5)execsp_helpfilegroup文件組名
(6)sp_deoption:查看,設(shè)置修改數(shù)據(jù)庫(kù)選項(xiàng)語(yǔ)法:sp_deoption[數(shù)據(jù)庫(kù)名,[選項(xiàng),值]]選項(xiàng)為:single單用戶,readonly只讀,autoclose自動(dòng)關(guān)閉,autoshrink自動(dòng)收縮如:sp_dboption"teacher","single","true"sp_dboption"teacher"--不給參數(shù),為查詢修改結(jié)果。(7)AlterDatabase設(shè)置、修改數(shù)據(jù)庫(kù)語(yǔ)法:
alterdatabase數(shù)據(jù)庫(kù)名addfile[tofilegroup文件組]addlogfileremovefile邏輯文件名addfilegroup文件組名removefilegroup文件組名modifyfilemodifyfilegroup文件組名,文件組屬性示例:alterdatabaseteacheraddfilegroupteachergrouptgoalterdatabaseteacheraddfile(name=teacheradd,filename=’F:\\SqlTest\\tdata3.ndf’)go說(shuō)明:文件正在使用時(shí)無(wú)法操作。3.4數(shù)據(jù)庫(kù)的分離與刪除
(1)分離:只是從SQLServer系統(tǒng)中刪除數(shù)據(jù)庫(kù),組成數(shù)據(jù)庫(kù)的數(shù)據(jù)文件和事務(wù)日務(wù)文件依然保存在磁盤上。
語(yǔ)法:sp_detach_db"數(shù)據(jù)庫(kù)名","是否分離前更新數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息"如:sp_detach_db"teacher","true"說(shuō)明:正在使用無(wú)法分離,分離后在SQLServer系統(tǒng)中無(wú)法看見。(2)刪除
語(yǔ)法:dropdatabase數(shù)據(jù)庫(kù)名如:dropdatabasetecher說(shuō)明:正在使用無(wú)法分離.習(xí)題:
(1)在企業(yè)管理器中,右擊要操作的數(shù)據(jù)庫(kù),在快捷菜單中選擇(新建數(shù)據(jù)庫(kù))命令創(chuàng)建數(shù)據(jù)
庫(kù),選擇(任務(wù)板)命令查看數(shù)據(jù)庫(kù)定義信息,選擇(屬性)命令設(shè)置數(shù)據(jù)庫(kù)選擇,選擇(屬性)命令修改數(shù)據(jù)庫(kù)結(jié)構(gòu),選擇(屬性)命令查看數(shù)據(jù)庫(kù)結(jié)構(gòu),使用(刪除)命令刪除數(shù)據(jù)庫(kù)。
(2)在查詢分析中,使用(createdatabase)命令創(chuàng)建數(shù)據(jù)庫(kù),使用(sp_helpdb)命令查看數(shù)據(jù)
庫(kù)定義信息,使用(sp_dboption)命令設(shè)置數(shù)據(jù)庫(kù)選項(xiàng),使用(alterdatabase)命令修改數(shù)據(jù)庫(kù)結(jié)構(gòu),使用(dropdatabase)命令刪除數(shù)據(jù)庫(kù).(3)在什么情況下不能刪除數(shù)據(jù)庫(kù)
dropdatabase可以一次刪除多個(gè)數(shù)據(jù)庫(kù),但刪除時(shí)不出現(xiàn)提示。正在被使用的數(shù)據(jù)庫(kù)不能被刪除。
第四章數(shù)據(jù)表的創(chuàng)建與操作
4.1數(shù)據(jù)類型4.1.1二進(jìn)制數(shù)據(jù)
(1)定長(zhǎng)二進(jìn)制binary(n):按n個(gè)字節(jié)的固定長(zhǎng)度存放二進(jìn)制數(shù)據(jù),最長(zhǎng)為8KB.1(2)短整型數(shù)據(jù):SmallInt:占2個(gè)字節(jié),固定長(zhǎng)度。-32768-32767(3)基本整型數(shù)據(jù)Int:占4個(gè)字節(jié),最高位為符號(hào)位。(4)長(zhǎng)整型整數(shù):Bigint:占8節(jié)字,最高們?yōu)榉?hào)位。(5)近似值實(shí)型浮點(diǎn)數(shù):Real,占4個(gè)字節(jié)固定長(zhǎng)度。
(6)可變精度實(shí)型浮點(diǎn)數(shù):Float(n)n值為124時(shí),精度是7位。N值為2553時(shí),精度為15位。
(7)精確小數(shù)型數(shù)據(jù)Numeric(p,s)p:總位數(shù),不含小數(shù)點(diǎn)。取值范圍1(3)Sql_variant:存儲(chǔ)除文本、圖像數(shù)據(jù)和Timestamp類型數(shù)據(jù)外的其他任務(wù)數(shù)據(jù)類型。(4)Table存儲(chǔ)對(duì)表或視圖處理后的結(jié)果集。
4.1.10局部變量的定義和輸出
(1)批處理:以Go語(yǔ)句為結(jié)束標(biāo)志。
(2)局部變量:用戶自定義的變量。用于臨時(shí)存儲(chǔ)各種類型數(shù)據(jù)。語(yǔ)法:Declare@變量名數(shù)據(jù)類型(長(zhǎng)度)賦值:Set@變量名=表達(dá)式輸出:Print@變量名或表達(dá)式4.2運(yùn)算符與表達(dá)式
(1)算述運(yùn)算符與表達(dá)式+、-、*、/、%(2)邏輯運(yùn)算符
邏輯值:True、False、Unknown:不確定,某個(gè)數(shù)據(jù)型與NULL比較的結(jié)果。比較運(yùn)算符:>、>=、=、語(yǔ)法:select字符from表where字段like"字符轉(zhuǎn)義字符其它"escape‘字符"示例:設(shè)tt表中字段tt值如下:t%%%%%tt%則語(yǔ)句:select*fromttwherettlike"c%%"escape"c",設(shè)置c后面的第一個(gè)字符為轉(zhuǎn)義字符。即c后的%為轉(zhuǎn)義字符,而第二個(gè)%仍為通配符。結(jié)果為:%%%tt%,即查以%開頭的字符。4.3系統(tǒng)內(nèi)置函數(shù)
示例:
printgetdate()--返回當(dāng)前系統(tǒng)時(shí)間printyear("201*-01-01")--返回年份
printDateadd(dd,20,"201*-01-01")--201*-01-01加20天printDateadd(mm,10,"201*-01-01")--201*-01-01加10月printDateadd(yy,10,"201*-01-01")--201*-01-01加10年
printDatediff(dd,"201*-01-01",getdate())--當(dāng)前天數(shù)減指定日期的天數(shù)據(jù)
printDatepart(mm,"201*-01-01")--指定日期的月份printDatepart(dd,"201*-01-01")--指定日期的日期
printdatename(mm,"201*-01-01")--返回字符串,指定日期的月份printcast(year("1979-02-26")aschar(4))+"年出生的人"+cast(datediff(yy,"1979-02-26",getdate())aschar(2))+"歲"
年齡是
4.5用T-SQL語(yǔ)句創(chuàng)建數(shù)據(jù)表及約束對(duì)象
在SQLServer201*中:
每個(gè)數(shù)據(jù)庫(kù)最多有20億個(gè)表每個(gè)表最多可以設(shè)置1024個(gè)字段
每條記錄最多占8060個(gè)字節(jié),不包括Text,NText,Image類型。
4.5.1用CreateTable語(yǔ)句創(chuàng)建表結(jié)構(gòu)
CreateTable表名(字段名類型長(zhǎng)度,字段名類型長(zhǎng)度,….)說(shuō)明:列定義必須放在括號(hào)里;參數(shù)順序不能改動(dòng);最多可設(shè)置1024列。字段屬性:Identity:自動(dòng)編號(hào)。Null|notNull允許空或不允許為空字段約束:Constraint約束名primarykey(主健名)Constraint約束名unique(惟一列名)Constraint約束名foreignkey(外鍵名)references(引用表名)Constraint約束名check(檢查表達(dá)式)Constraint約束名default默認(rèn)值示例:createtableprovider(PIDchar(4)notnullprimarykeycheck(PIDlike"[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]"),--只允許輸入4位英文或數(shù)字PNameNvarchar(15)notnullunique,PAddressNvarchar(20)notnullunique,PAccountChar(15)notnullunique,PLinkNanvarchar(8))4.5.2用AlterTable語(yǔ)句修改表結(jié)構(gòu)
語(yǔ)法:AlterTable表名Add列名,數(shù)據(jù)類型(長(zhǎng)度)default’默認(rèn)值’notnull--添加新列Dropcolumn列名數(shù)據(jù)類型(長(zhǎng)度)notnull--刪除列Addconstraint--添加約束Dropconstraint約束名--刪除列約束Nocheckconstraint約束名--設(shè)置列約束無(wú)效Checkconstraint約束名--設(shè)置列約束有效Disabletrigger觸發(fā)器名禁用觸發(fā)器Enabletrigger觸發(fā)器名重新啟用觸發(fā)器說(shuō)明:AlterTable語(yǔ)句中只能使用單個(gè)子句,即各個(gè)子句不能組合使用。(1)使用add子句添加列altertableprovideraddLinkTelchar(15)notnulldefault"00000000000"說(shuō)明:可以同時(shí)設(shè)置空值約束、默認(rèn)值約束;若不允許為空則必須給新增加的列指定默認(rèn)值,否則出錯(cuò)。(2)使用altercolumn修改字段屬性altertableprovideraltercolumnLinkTelchar(20)說(shuō)明:將一個(gè)原來(lái)允許為空值的列為不允許為空時(shí),必須保證表中已有記錄中沒有空值,而且該列沒有創(chuàng)建索引;改變數(shù)據(jù)類型時(shí),如果原來(lái)設(shè)置默認(rèn)值約束,一般應(yīng)先觸除或刪除約束后再修改,否則容易出錯(cuò)。(3)使用addconstraint子句添加列約束altertableprovideraddconstraintuniqueProviderunique(PName)說(shuō)明:約束必須指定約束名,而且必須是惟一的,不能與數(shù)據(jù)庫(kù)已定義的其他規(guī)則對(duì)象、默認(rèn)值對(duì)象同名;若約束類型及定義沒有指定列名時(shí),必須用for指定列名;若約束類型及定義中已包含了列名,則不允許使用for子句;如果只允許有一個(gè)約束列已經(jīng)設(shè)置了(檢查約束除外),則原有約束未觸除時(shí)不能添加新的約束;altertableprovideraddconstraintTelConstraintunique(LinkTel),default"0431-123456789"forLinkTel/*unique(LinkTel)后面叵使用forLinkTel是錯(cuò)誤的*//*而default后面省略for也是錯(cuò)誤的*//*默認(rèn)值只能有一個(gè),固無(wú)法執(zhí)行*/(4)用nocheck|checconstraint子句設(shè)置約束無(wú)效、恢復(fù)有效altertableprovidernocheckconstraintuniqueProvideraltertableprovidercheckconstraintuniqueProvideralter(5)用dropcolumn刪除字段dropconstraint刪除約束altertableproviderdropconstraintTelConstraintaltertableproviderdropcolumnLinkTel說(shuō)明:刪除列時(shí)必須先刪除該字段上創(chuàng)建索引和索引后,才能刪除。4.5.3
用T-SQL語(yǔ)句、綁定、解除約束對(duì)象
(1)創(chuàng)建、綁定或解除規(guī)則對(duì)象語(yǔ)法:Createrule規(guī)則名稱as條件表達(dá)式說(shuō)明:規(guī)則名稱必須符合標(biāo)識(shí)符的構(gòu)成規(guī)則;條件表達(dá)式不能包含任何字段或其他數(shù)據(jù)庫(kù)對(duì)象名,可以用@開頭的局部變量代表自己表中被綁定的字段;createrule不能與其他語(yǔ)句組合使用,必須單獨(dú)作為一個(gè)批處理語(yǔ)句。語(yǔ)法:用存儲(chǔ)過(guò)程綁定Sp_bindrule‘規(guī)則名稱’‘表名.字段名’|‘自定義數(shù)據(jù)類型名’語(yǔ)法:用存儲(chǔ)過(guò)程解除綁定Sp_unbindrule‘表名.字段名’|’自定義數(shù)據(jù)類型名’說(shuō)明:規(guī)則不能梆定在系統(tǒng)的基本數(shù)據(jù)類型上。規(guī)則必須與綁定字段的數(shù)據(jù)類型相匹配,不能綁定在text,image字段上;若被綁定字段上已有綁定的規(guī)則對(duì)象,則綁定新規(guī)則時(shí)原有規(guī)則被自動(dòng)替換;當(dāng)一個(gè)字段同時(shí)綁定規(guī)則和默認(rèn)值時(shí),默認(rèn)值必須滿足規(guī)則的要求。示例:createrulePAccount--前8個(gè)字符只允許數(shù)字和-as@xlike"[-0-9][-0-9][-0-9][-0-9][-0-9][-0-9][-0-9][-0-9]"execsp_bindrule"PAccount","provider.PAddress"--綁定execsp_unbindrule"provider.PAddress"--解除綁定(2)使用SQL語(yǔ)句創(chuàng)建、綁定和解除默認(rèn)值對(duì)象語(yǔ)法:Createdefault默認(rèn)值名稱as常量表達(dá)式說(shuō)明:必須單獨(dú)作為一個(gè)批處理語(yǔ)句。用存儲(chǔ)過(guò)程綁定和解除語(yǔ)法:Sp_bindefault‘默認(rèn)值名稱’,’表名.字段名’|自定義數(shù)據(jù)類型名Sp_unbindefault‘表名.字段名’|自定義數(shù)據(jù)類型名說(shuō)明:不能將默認(rèn)值對(duì)象綁定到標(biāo)認(rèn)列(indentity自動(dòng)編號(hào)),不能綁定到在企業(yè)管理創(chuàng)建表時(shí)已設(shè)置默認(rèn)值字段,也不能綁定到基本數(shù)據(jù)類型上;若被綁定字段上原有綁定的默認(rèn)值對(duì)象,則綁定新默認(rèn)值對(duì)象時(shí)原有默認(rèn)值對(duì)象被自動(dòng)替換。若綁定成功則sp_bindefault返回0,失敗返回1.createdefaultdefaultAccountas"0000-000-0000"execsp_bindefault"defaultAccount","provider.PAccount"4.6查看表信息、輸入數(shù)據(jù)、編輯和刪除記錄(1)顯示表結(jié)構(gòu)及相關(guān)性Sp_help表名(2)插入記錄語(yǔ)法:Insert[into]表名[字段列表]Values[值列表]說(shuō)明:只參添加一條記錄;順序可以任意,但個(gè)數(shù)、順序和類型必須一致;字段列表可以省略,但順序必須與表中字段順序一致,自動(dòng)編號(hào)標(biāo)識(shí)列不允許提供數(shù)據(jù)(直接省略,也不能使用逗號(hào)),允許為空的字段不提供數(shù)據(jù)時(shí)必須使用null;只有允許為null的列才能省略不提供數(shù)據(jù),自動(dòng)編號(hào)字段必須省略;字符型與日期類型用單引號(hào)括起來(lái);默認(rèn)值用default代理默認(rèn)值;可以嵌套使用子查詢的數(shù)據(jù),但必須使用圓括號(hào)括起來(lái)。示例:insertintoprovidervalues("SDLC","山東省浪潮集團(tuán)","濟(jì)南市大山路15號(hào)","1002-305-5","趙群","0431-2569874")語(yǔ)法:Insert目標(biāo)表名字段列表select字段列表from源表名where條件示例:inserttProviderselectPId,Pname,Paddress,PAccount,PlinkNanfromprovider4.6.3向表中插入文本或圖像數(shù)據(jù)
使用企業(yè)管理器或Insert語(yǔ)句可以直接向text,ntext字段的行內(nèi)輸入添加數(shù)據(jù),但數(shù)據(jù)最大長(zhǎng)度不能超過(guò)對(duì)應(yīng)的char,nchar數(shù)據(jù)類型允許的長(zhǎng)度。語(yǔ)法:WriteText表名.列名指針數(shù)據(jù)庫(kù)說(shuō)明:對(duì)現(xiàn)有text,ntext或image列進(jìn)交互或更新,原有數(shù)據(jù)將被完全覆蓋。默認(rèn)狀態(tài)下,不被記錄入事務(wù)日志;指針表示指向text,ntext或image數(shù)據(jù)的指針,其數(shù)據(jù)類型必須為binary(16);最大長(zhǎng)度為120K.不能用在視圖中的text,ntext和image列上。執(zhí)行WriteText語(yǔ)句必須用TextPTR指針獲取有效的文本指針。示例:inserttProviderselectPId,Pname,Paddress,PAccount,PlinkNanfromprovidersp_dboptionDianNaoXS,"selectinto/bulkcopy","true"--允許大容易復(fù)制updateEmployeesetDescription=nullwhereid="11001"--執(zhí)行更行,以獲得指針declare@ptrtextbinary(16)--定義變量select@ptrtext=textptr([Description])fromEmployeewhereid="11001"--獲得文本指針writetextEmployee.Description@ptrtext"201*畢業(yè)于清華大學(xué)"--復(fù)制大容量數(shù)據(jù)sp_dboptionDianNaoXS,"selectinto/bulkcopy","false"--取消允許大容量復(fù)制語(yǔ)法:TextCopy[/s服務(wù)器名][/U登錄名][/P登錄密碼][/D數(shù)據(jù)庫(kù)名][/T表名][/C列名][/Wwhere(條件){/i|/o}]/i:指定的圖像或文本輸入保存到數(shù)據(jù)表中。/o:把圖像或文本從字段輸出保存為指定磁盤。安裝時(shí)不在目錄中,從安裝盤上x86文件中獲取,拷貝到\\80\\Tools\\Binn文件夾內(nèi)。updateEmployeesetPhoto=0xwhereid="11001"--執(zhí)行更行,以獲得指針declare@svarchar(200)set@s="textcopy/Usa/Psa/DDianNaoXS/TEmployee/CPhoto/Wwhere(id=11001)/FF;\\f.jpg/i"execmaster..xp_cmdshell@s4.6.3數(shù)據(jù)表的復(fù)制
語(yǔ)法:Select字段列表into新表from源表where條件說(shuō)明:源表上綁定的約束不能被復(fù)制。4.6.5更新、編輯或刪除
語(yǔ)法:Update表名Set列名=值,列名=值…from表名UpdateText表名.列名指針null|位置null|長(zhǎng)度數(shù)據(jù)Delete表名from表名Where條件TrunCateTable表名快速永久刪除全部記錄。只保留表結(jié)構(gòu)。4.6.2DropTable刪除數(shù)據(jù)庫(kù)及約束
DropTable表名說(shuō)明:一次可以刪除多個(gè)表,但不能刪除系統(tǒng)表;不能刪除有外鍵約束的表;數(shù)據(jù)、結(jié)構(gòu)、約束、索引都將同時(shí)被刪除。習(xí)題:
1.SQLServer提供的系統(tǒng)數(shù)據(jù)類型有(二進(jìn)制)(數(shù)值)Unicode數(shù)據(jù)、(字符)(日期)和貨幣數(shù)據(jù),也可以使用用戶定義的數(shù)據(jù)類型。
2.文本和圖像數(shù)據(jù)在SQLServer中是用text,ntext和image數(shù)據(jù)類型來(lái)表示的,由于它們的數(shù)據(jù)量一般較大,所以經(jīng)常被存儲(chǔ)在專門頁(yè)中,在數(shù)據(jù)行的相應(yīng)位置處只保存儲(chǔ)指向這些數(shù)據(jù)存儲(chǔ)位置的(指針).SQLServer201*中,使用(sp_tableOption)可用于指定表中文本和圖像數(shù)據(jù)是否在(表中的行)中存儲(chǔ)。
3.創(chuàng)建表用(createtable)語(yǔ)句,向表中添加記錄用(insertinto)語(yǔ)句,查看表的定義信息用(sp_help)語(yǔ)句,刪除表用(droptable)語(yǔ)句。4.規(guī)則的作用是(用于字段的檢查約束,限制該字段的輸入范圍).創(chuàng)建規(guī)則有(createrule)語(yǔ)句,刪除規(guī)則用()語(yǔ)句。在列或自定義數(shù)據(jù)類型上綁定規(guī)則用(sp_bindrule)語(yǔ)句。解除綁定的規(guī)則用(sp_unbindrule)語(yǔ)句。再次向已經(jīng)綁定了規(guī)則的列上綁定規(guī)則,將會(huì)(原有規(guī)則被自動(dòng)替換)。
5.默認(rèn)值的作用是()。創(chuàng)建默認(rèn)值用(createdefault)語(yǔ)句。刪除默認(rèn)值用()語(yǔ)句。綁定默認(rèn)值用(sp_bindefault)語(yǔ)句。解除綁定的默認(rèn)值用(sp_unbindefault)語(yǔ)句。
6.如果當(dāng)前日期為201*/9/17,下面可以返回17函數(shù)是(datepart(day,getdate()));7.執(zhí)行下面語(yǔ)句;結(jié)果是:1,2,1.40
createtablenumbers(n1int,n2numeric(5,0),n3numeric(4,2))goinsertnumbersvalues(1.7,1.6,1.4)select*fromnumbers
8.若想刪除orders表中所有超過(guò)3年的老定單,可以使用的SQL語(yǔ)句是(deletefromorderwhereorderTime[記錄范圍]-->字段列有[into][From][where][Groupby]Having[Orderby]Compute
(2)Compute子句不能與into或groupby子句同時(shí)使用。
5.1.2無(wú)數(shù)據(jù)檢索
select"helloword"select256*256select你好="helloword"select計(jì)算=256*256select@@versionselect@@language5.1.3指定字段列表及列別名
*:全部數(shù)據(jù)表字段表名.*:多表查詢時(shí)指定表的全部字段語(yǔ)法:Select字段From表where條件說(shuō)明:多表查詢時(shí)同名字段必須加表名前綴;可以有計(jì)算列。別名相當(dāng)于字段變量。別名不允許出現(xiàn)在其他表達(dá)式中。5.1.4指定范圍
ALL|Distinct[Row]|Topn[percent]ALLDistinctTop三項(xiàng)參數(shù)必須單獨(dú)使用,不能同時(shí)出現(xiàn)在一個(gè)select語(yǔ)句中。selectall*fromsale--表中所有數(shù)據(jù)selectdistinct*fromsale--去掉重復(fù)項(xiàng)selecttop5*fromsale--前5條數(shù)據(jù)selecttop20percent*fromsale--前20%條數(shù)據(jù)select商品信息=id+","+name,每件毛利=PurchasePrice*0.1,30*2+5as字段外數(shù)據(jù),256*256fromGoods5.1.5使用Where子句
說(shuō)明:where必須在from后面。selectid,name,spec,原參考價(jià)格=PurchasePrice,下浮后價(jià)格=PurchasePrice*0.75fromGoodswherePurchasePrice*0.75="201*-2-1"anddateTime名.列名”,不允許使用”表名.列名”5.2.3外連接left|right|full|join
(1)左外連接Select字段列表From表1leftjoin表2on表1.列名=表2.列名說(shuō)明:默認(rèn)按左表的主鍵順序排序(2)右外連接Select字段列表From表1rightjoin表2on表1.列名=表2.列名(3)全外連接
返回左表與右表的全部記錄。Select字段列表From表1fulljoin表2on表1.列名=表2.列名(4)自內(nèi)連接join是一張表自己對(duì)自己的內(nèi)連接,即在一張表的兩個(gè)副本之間進(jìn)行內(nèi)連接。使用自連接時(shí),必須為兩個(gè)副表指定別名。
Select字段列表From表as別名1join表as別名2on別名1.列名=別名2.列名5.2.5使用Into子句創(chuàng)建新表
Select字段列表into新表名from源表名where條件說(shuō)明:into子句必須是select語(yǔ)句的第一個(gè)子句。新表名可以是以#開頭的臨時(shí)表,也可以記錄表,新表中沒有原表字段上綁定的約束對(duì)象。用戶必須有創(chuàng)建表的權(quán)限。Into子句不能與compute子句一起使用。5.3用select語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)匯總5.3.1集合函數(shù)不清
Avg([ALL|Distinct]列名)Sum([ALL|Distinct]列名)Max([ALL|Distinct]列名)Min([ALL|Distinct]列名)Count([ALL|Distinct]列名)Count(*)說(shuō)明:Count(*)可以包括空值記錄,其他函數(shù)均不統(tǒng)計(jì)空值記錄。集合函數(shù)使用Distinct時(shí)則不允許使用計(jì)算列或字段列名。集合函數(shù)將查詢結(jié)果集統(tǒng)計(jì)為單一數(shù)據(jù),即匯總為一條記錄,在select中使用了集合函數(shù)就不允許再指定字段名,用Groupby指定的字段除外。5.3.2用Groupby子句對(duì)記錄分類統(tǒng)計(jì)匯總
按某一字段的數(shù)據(jù)值進(jìn)行分類之后再進(jìn)行統(tǒng)計(jì)格式:Groupby分組字段Having條件說(shuō)明:使用Groupby子句時(shí),select指定的字段必須包含且只能包含Groupby子句中指定的分組字段,其他必須是由集合函數(shù)組成的一個(gè)或多個(gè)計(jì)算列。Groupby子句不允許使用字段或計(jì)算的別名,可直接使用表達(dá)式。Groupby子句指定表達(dá)式時(shí),select指定的字段中可以不包括該表達(dá)式。Having子句用于指定統(tǒng)計(jì)結(jié)果所要滿足的條件,表達(dá)式中可以直接使用計(jì)算列的表達(dá)式而不允許使用別名。Having子句必須配合Groupby子句使用,且設(shè)置的條件必須與Groupby子句指定的分組字段有關(guān)。使用Groupby的Select語(yǔ)句仍然可以使用Orderby子句統(tǒng)計(jì)結(jié)果排序,但必須在Groupby之后,可以使用別名但不允許對(duì)select沒指定的列Having子句是對(duì)分組統(tǒng)計(jì)后的查詢結(jié)果進(jìn)行篩選,在統(tǒng)計(jì)結(jié)果中選擇滿足條件的記錄作為統(tǒng)計(jì)匯總后的結(jié)果集。使用Groupby的select語(yǔ)句仍可使用where子句指定條件,但where子句是在分組前對(duì)原表記錄進(jìn)行篩選,使?jié)M足條件的記錄參加分組統(tǒng)計(jì)。分組字段會(huì)過(guò)濾null,null被忽略selectname,商品數(shù)量=count(id),平均價(jià)格=avg(purchasePrice)fromgoodsgroupbynameselect職工人數(shù)=count(*),平均年齡=Cast(avg(year(getdate())-year(brithday))asvarchar(2))+"歲",最大年齡=max(year(getdate())-year(brithday)),最小年齡=min(year(getdate())-year(brithday)),平均工齡=Cast(avg(year(getdate())-year(WorkTime))asvarchar(2))+"年",最長(zhǎng)工齡=max(year(getdate())-year(worktime)),最短工齡=min(year(getdate())-year(worktime))fromemployeeselectGoodId,銷售總量=sum(num),平均價(jià)格=avg(SalePrice),銷售總額=sum(SalePrice)fromSalewhereGoodname"計(jì)算機(jī)"groupbyGoodIdselectGoodId,銷售總量=sum(num),平均價(jià)格=avg(SalePrice),銷售總額=sum(SalePrice)fromSalegroupbyGoodIdHavingGoodname"計(jì)算機(jī)"--出錯(cuò),因?yàn)樵诜纸M結(jié)果沒有Goodname5.3.4用Compute子句顯示參加統(tǒng)計(jì)的清單及統(tǒng)計(jì)結(jié)果
語(yǔ)法:Compute集合函數(shù)(列名)說(shuō)明:Compute子句可以指定多個(gè)集合函數(shù),但不允許指定別名。Select指定的字段列表是顯示詳細(xì)使用的字段,必須包含Compute子句集合函數(shù)使用的列名1,與by分組字段列名2無(wú)關(guān),也可以使用(*)表示全部字段。Compute子句不帶by表示對(duì)全部記錄統(tǒng)計(jì),相當(dāng)于在select查詢結(jié)果后面帶一個(gè)統(tǒng)計(jì)值的后綴.Compute子句帶by表示對(duì)全部記錄統(tǒng)計(jì),必須配合orderby排序子句使用,且緊跟orderby之后。By后的列名2是要分組的字段(相當(dāng)于groupby),可以不在select指定的字段中,但必須包含在orderby子句中,而且必須是第一順序。By指定多個(gè)字段分組時(shí),也必須與orderby的第一順序一致。Compute子句不能與into子句或groupby子句同時(shí)使用。一個(gè)select語(yǔ)句中可以使用多個(gè)compute子句,一個(gè)子句顯示一個(gè)附加行,多個(gè)子句時(shí)by分組字段必須一致,且與orderby一致,子句之間不能使用逗號(hào)。select*fromsaleorderbyHandlers,DateTimecomputesum(Price)byhandlers5.4Select合并結(jié)果集與子查詢5.4.1合并查詢結(jié)果集
UNION關(guān)鍵了可以把兩個(gè)以上的查詢結(jié)果合并為一個(gè)結(jié)果集。語(yǔ)法:Select語(yǔ)句1UNION[ALL]select語(yǔ)句2說(shuō)明:Union所合并的是兩個(gè)select的查詢結(jié)果集而不是合并被查詢的數(shù)據(jù)表,兩個(gè)結(jié)果集必須具有相同的列數(shù)、相同的對(duì)應(yīng)數(shù)據(jù)類型。合并后結(jié)果集中的列名來(lái)自第一個(gè)select語(yǔ)句任一個(gè)select中若包含orderby子句都將被對(duì)最后的結(jié)果集排序。使用All關(guān)鍵字則不刪除重復(fù)行,保留兩個(gè)結(jié)果集的全部,若不指定ALL則默認(rèn)在合并后的結(jié)果集中刪除重復(fù)行。selectDateTime,Customer,GoodName,numfromSaleAwherePrice>=1000UnionselectDateTime,Customer,GoodName,numfromSaleBwherePrice(selectavg(price)fromsale)(2)使用子查詢的一列值進(jìn)行列表包含in運(yùn)算select*fromgoodswhereidin(selectgoodidfromsale)(3)使用子查詢的一列值進(jìn)行列表比較ANY/ALL運(yùn)算只要有一個(gè)比較成立:ANY結(jié)果為true只有全部比較都成立:ALL結(jié)果為true.select*fromgoodswhereid=ANY(selectgoodidfromsale)(4)相關(guān)子查詢及記錄的存在性[not]exists
相關(guān)子查詢就是子查詢的執(zhí)行依賴于外部查詢,子查詢根據(jù)外部查詢提供的數(shù)據(jù)得到結(jié)果,再將結(jié)果返回給外部查詢。
外部查詢可以使用存在邏輯運(yùn)算[not]exists檢查相關(guān)子查詢返回的結(jié)果集中是否包含有記錄。若子查詢結(jié)果集包含記錄,則exists為true,否則為false.存在性的邏輯值沒有UnKnown.相關(guān)子查詢引用外部查詢的表時(shí)可以使用該表的別名。select*fromGoodswhereexists(select*fromsalewheregoods.id=sale.goodid)5.6視圖的基本概念
視圖:就是基于一個(gè)或多個(gè)表的動(dòng)態(tài)數(shù)據(jù)集合,是一個(gè)邏輯上的虛擬數(shù)據(jù)表?梢灾苯釉谝晥D在對(duì)數(shù)據(jù)進(jìn)行編輯修改刪除更新數(shù)據(jù)表中的數(shù)據(jù)。Select,Insert,update語(yǔ)句都可以直接對(duì)視圖進(jìn)行操作。
使用視圖的優(yōu)點(diǎn):1)為用戶集中數(shù)據(jù)、簡(jiǎn)化查詢和處理2)屏蔽數(shù)據(jù)庫(kù)的復(fù)雜性3)簡(jiǎn)化用戶權(quán)限的管理4)實(shí)現(xiàn)真正意義上的數(shù)據(jù)共享5)重新組織數(shù)據(jù)。
5.7視圖的創(chuàng)建和使用。5.7.1對(duì)創(chuàng)建視圖的限制和要求
創(chuàng)建視圖只能在當(dāng)前數(shù)據(jù)庫(kù)中進(jìn)行,創(chuàng)建視圖不能引用臨時(shí)表。視圖的命名不必須遵循標(biāo)識(shí)符命名規(guī)則,在一個(gè)數(shù)據(jù)庫(kù)中對(duì)每個(gè)用戶所定義視圖名必須
是惟一的,也不能與表同名。
一個(gè)視圖最多只能有1024個(gè)字段。
可以引用其他視圖或被其他視圖引用,但視嵌套引用不能超過(guò)32層。不能把規(guī)則、默認(rèn)值或觸發(fā)器綁定在視圖上。不能在視圖上建立任何索引。
定義視圖的select查詢不能包含以下子句:into,orderby,compute。使用視圖時(shí),如果它引用基本表添加了新字段,則必須重新創(chuàng)建或修改視圖才能查詢使
用新字段。
如果與視圖相關(guān)聯(lián)的表或視被刪除,則視該視圖不能再使用。
5.7.3使用SQL語(yǔ)句創(chuàng)建和使用視圖
語(yǔ)法:Createview視圖名[withEncryption]asselect查詢[withcheckoption]說(shuō)明:Encryption:要求系統(tǒng)存儲(chǔ)時(shí)對(duì)該createview語(yǔ)句進(jìn)行加密,不允許另人查看和修改CheckOption:與定義視圖中的select語(yǔ)句的where子句配合使用,指定對(duì)視圖中數(shù)據(jù)的修改必須遵守where子句設(shè)置的條件,不滿足條件的數(shù)據(jù)不允許修改,保證修改后的數(shù)據(jù)能通過(guò)視圖查看,省略時(shí)可以不違反約束前提示任意修改,但修改后不滿足條件記錄不再出現(xiàn)在視圖。5.8.2用SQL語(yǔ)句查看編輯刪除視圖
Sp_help視圖名Sp_helptext視圖名Sp_depents視圖名AlterView視圖名[withEncryption]asselect查詢[withcheckoption]DropView視圖名習(xí)題
(1)select語(yǔ)句使用(ALL)(Topn)(Distinct)指定查詢的顯示范圍,使用(into)子句創(chuàng)建新表,使用(orderby)子句指定排序字段,使用(where)指定查詢條件,使用(groupby)指定分組條件,使用(compute)指定分組后的查詢條件。
(2)select語(yǔ)句對(duì)查詢結(jié)果排序時(shí),使用(orderby)子句指定排序字段,使用(asc)指定升序,使用(desc)指定降序.
(3)select語(yǔ)句對(duì)多表查詢可以使用(交叉連接)(內(nèi)連接)(外連接)(自連接)連接方式,子查詢分為(嵌套子查詢)(相關(guān)子查詢)兩種
(4)視圖是由()構(gòu)成的而不是由()構(gòu)成的慮表。視圖中的數(shù)據(jù)存儲(chǔ)在(數(shù)據(jù)表)。對(duì)視圖更新操作時(shí)實(shí)際操作的是(基表)中的數(shù)據(jù)。
(5)創(chuàng)建視圖用(createview)語(yǔ)句,修改視圖用(alterview)語(yǔ)句,刪除視圖用(dropview)語(yǔ)句。查看視圖中的定義數(shù)據(jù)用(select)語(yǔ)句。查看視圖的基本信息用(sp_help)存儲(chǔ)過(guò)程。查看視的定義信息用(sp_helptext)存儲(chǔ)過(guò)程。查看視圖的依賴關(guān)系用(sp_depends)存儲(chǔ)過(guò)程.
(6)創(chuàng)建視圖帶(Encryption)參數(shù)使視圖的定義語(yǔ)句加密。帶(CheckOption)參數(shù)對(duì)視圖執(zhí)行的修改操作必須遵守定義視圖時(shí)Where子句指定的條件。(7)更新視圖中的數(shù)據(jù)進(jìn),應(yīng)該注意()()().
(8)下列可用于創(chuàng)建一個(gè)新表,并用已存在的表的數(shù)據(jù)填充到新表中的是(selectinto)(9)(comoute)子句為聚合函數(shù)生成匯總值,并作為一個(gè)附加的行顯示在結(jié)果集中。(10)有關(guān)comoute子句說(shuō)法正確的是:(A)?
A.compute子句為聚合函數(shù)生成匯總值B.compute子句必須包括orderby子句C.compute子句只在控制中斷時(shí)會(huì)給出匯總。D.compute子句對(duì)排序進(jìn)行篩選.(11)(exists)可以與子查詢一起使用檢查行或是否存在。(12)子查詢可以返回()行而不產(chǎn)生錯(cuò)誤。
A.僅一行B.如果不以ANY,ALL,Exists或IN開頭,則僅一行。C.無(wú)限多行D.如果不以ANY,ALL,Exists或IN開頭,則為無(wú)限行。
13)使用子查詢時(shí)愛一定的限制,下列說(shuō)明正確的有(包括Groupby的子查詢不能使用Distinct關(guān)鍵字)(如果外部查詢的Where子包括某個(gè)列名,則該子句必須與子查詢選擇列表中的該列在聯(lián)接上兼容)兩項(xiàng)。
14)當(dāng)子查詢使用來(lái)自父查詢的參數(shù),我們稱之為(相關(guān)子查詢).15)我們將調(diào)用另一個(gè)子查詢的子查詢稱為(嵌套子查詢);16)從“產(chǎn)品”表里查詢出價(jià)格高于產(chǎn)品名稱為“海天醬油”的產(chǎn)品記錄,此SQL語(yǔ)句為(select*from產(chǎn)品where價(jià)格>(select價(jià)格from產(chǎn)品where產(chǎn)品名稱=’海天醬油’)).17)為數(shù)據(jù)庫(kù)中一個(gè)或多個(gè)表提供另一種查看方式的邏輯表被為(視圖)18)SQLServer最多允許視圖嵌套(32)級(jí)。19)SQLServer的視圖最多可包括(1024)列
20)在SQL數(shù)據(jù)庫(kù)中,要得到Products表中最貴的產(chǎn)品的產(chǎn)品名稱productname和產(chǎn)品價(jià)格price應(yīng)該使用的查詢是:
A.selecttop1productname,pricefromproductsorderbyprice出錯(cuò),procutname不在groupby分組中。
B.selectprocuctname,max(price)fromproducts出錯(cuò),procutname不在groupby分組中。C.selectproductname,max(price)fromproductsgroupbyproductname各種產(chǎn)品中價(jià)格最價(jià)的。
D.selectproductname,PricefromproductwherePrice=(selectmax(Price)fromproduct)
第6章數(shù)據(jù)庫(kù)索引
6.1索引概述6.1.1什么是索引
索引是一個(gè)在表或視圖上創(chuàng)建的對(duì)象,當(dāng)用戶查詢索引字段時(shí),它可以快速實(shí)施數(shù)據(jù)檢索操作。
索引提供指針以指向存儲(chǔ)在表中指定字段的數(shù)據(jù)值。借助索引,執(zhí)行查詢時(shí)不必掃描整個(gè)表就能快速找到所需要的數(shù)據(jù)。
索引字段,創(chuàng)建索引的字段。索引列是一個(gè)字段,稱為簡(jiǎn)單索引。由多個(gè)字段組合的索引,稱為復(fù)合索引。索引列的值可以設(shè)置為唯一,稱為唯一索引。也可以把索引設(shè)置為有重復(fù)值,稱為非惟一索引。
6.1.2索引的分類:
(1)簇索引:簇索引對(duì)表的物理數(shù)據(jù)頁(yè)中的數(shù)據(jù)按列進(jìn)行排序,然后再重新存儲(chǔ)到磁盤上,即簇索引與數(shù)據(jù)是混為一體的。由于簇索引對(duì)表中的數(shù)據(jù)一一進(jìn)行了排序,因此用簇索引查找數(shù)據(jù)很快。但由于簇索引簇索引將表所有數(shù)據(jù)完全重新排序了,它所需要空間大,大概相當(dāng)于表中數(shù)據(jù)所占空間的120%。表的數(shù)據(jù)行只能以一種排序方式存儲(chǔ)在磁盤上,所有一個(gè)只能有一個(gè)簇索引。
(2)非簇索引:具有與表的數(shù)據(jù)完全分離的結(jié)構(gòu),使用非簇索引不用將物理數(shù)據(jù)頁(yè)中的數(shù)據(jù)按列排序。非簇索引中存儲(chǔ)了組成非簇索引的關(guān)鍵字的值和行定位器。行定位器的結(jié)構(gòu)和存儲(chǔ)內(nèi)容取決地?cái)?shù)據(jù)的存儲(chǔ)方式,如果數(shù)據(jù)是以簇索引方式存儲(chǔ)的,則行定位器中存儲(chǔ)的是簇索引的索引鍵。如果數(shù)據(jù)不是簇索引方式存儲(chǔ)的,這種方式又稱為堆存儲(chǔ)方式,則行定位器存儲(chǔ)的是指向數(shù)據(jù)行的指針。非簇索引將行定位器按關(guān)鍵字的值用一定的方式排序,這個(gè)順序與表的行在數(shù)據(jù)頁(yè)中排序是不匹配的。由于非簇索引使用索引頁(yè)存儲(chǔ),因此它比簇索引需要更多的存儲(chǔ)空間,且檢索效率較低。但一個(gè)表最多可以建249個(gè)非簇索引。(3)性能比較簇索引每個(gè)表只能有一個(gè)快速快,取出一個(gè)范圍時(shí)更快。非簇索引一個(gè)表可以有多個(gè),最多249快速慢需要大量的硬空間和內(nèi)存?梢蕴岣邚谋碇腥(shù)據(jù)的速度,但會(huì)降低向表中插入數(shù)據(jù)的速度。6.2創(chuàng)建索引
6.2.1用CreateIndex命令創(chuàng)建索引語(yǔ)法:Create[Unique][Clustered|NoNClustered]Index索引名on{表|視圖}列名[ASC|DESC][with[PAD_INDEX][FillFactor=fillfactor][Ignore_Dup_Key][Drop_Existing][Statistics_Norecompute][Soort_In_Temped]][On文件組]說(shuō)明:Unique:創(chuàng)建惟一索引,索引鍵值不重復(fù)。在列包含重復(fù)值時(shí),不能創(chuàng)建。列不能包含null索引。Clustered:創(chuàng)建簇索引。默認(rèn)創(chuàng)建非簇索引。NONClustered:創(chuàng)建非簇索引。一個(gè)索引中最多可以指定16個(gè)列,但列數(shù)據(jù)類型的長(zhǎng)度不能超過(guò)900個(gè)字節(jié)。PAD-Index:指定填充索引的內(nèi)部節(jié)點(diǎn)的行數(shù)至少應(yīng)大于等于兩行。只有在FillFactor選項(xiàng)指定后才起作用。因?yàn)镻AD-Index與FillFactor使用相同的百分比。FillFactor:填充因子,它指定創(chuàng)建索引時(shí)每個(gè)索引頁(yè)的數(shù)據(jù)占索引頁(yè)大小的百分比。值為1100。Ignore_Dup_key:控制了當(dāng)往包含一個(gè)惟一索引中的列中插入重復(fù)數(shù)據(jù),SQLServer所作的反應(yīng)。Drop_Existing:指定要?jiǎng)h除并重新創(chuàng)建簇索引。StatisTisc_Norecompute:指定過(guò)期的索引統(tǒng)計(jì)不會(huì)自動(dòng)重新計(jì)算。Sor_in_tempdb:指定用于創(chuàng)建索引的分類排序結(jié)果,將被存儲(chǔ)到tmpdeb數(shù)據(jù)庫(kù)中。OnFilegroup:指定存放的文件組說(shuō)明:數(shù)據(jù)類型textntext,image或bit的列不能作為索引列。數(shù)據(jù)類型char,varchar,binary,varbinary的列寬超過(guò)900節(jié)字,或數(shù)據(jù)類型nchar,nvarchar的列寬超過(guò)450個(gè)字節(jié)時(shí)也不能作為索引列。在創(chuàng)建向?qū)е胁荒軐⒂?jì)算列包含在索引中。但在直接創(chuàng)建或使用createindex命令創(chuàng)建索引時(shí),則可以對(duì)計(jì)算列創(chuàng)建索引。createuniqueclusteredindexPk_goods--惟一簇索引ongoods(id)withpad_index,fillfactor=10,drop_existingcreateindexindex_goods--非簇索引ongoods(id,Spec)withpad_index,fillfactor=50on[primary]6.3查詢索引
Sp_helpindex表名--返回表的所有索引信息Sp_rename‘舊名’,’新名’,’index’--改名6.4刪除索引
Dropindex‘表名.索引名’說(shuō)明:不能刪除由Createtable或Altertable命令創(chuàng)建的primarykey或unique約束索引,也不能刪除系統(tǒng)表中的索引。6.5設(shè)計(jì)索引
創(chuàng)建索引的思路:
(1)主鍵時(shí)常作為where子句的條件。
(2)有大量重復(fù)值且經(jīng)常有范圍查詢和排序、分組發(fā)生的列。非常頻繁被訪問(wèn)的列?梢越⒋厮饕。
(3)經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值。
(4)如果知道索引鍵所有值都有是惟一的,可以定義惟一索引.
(5)在一個(gè)經(jīng)常做插入操作的表上建索引是,使用fillfactor來(lái)減少頁(yè)分裂,可以提高并發(fā)度降低列鎖發(fā)生。
(6)設(shè)法選擇那些采用小數(shù)據(jù)類型列作為索引列。(7)下面情況不應(yīng)該使用索引
1)索引總是不能被優(yōu)化程序使用。
2)返回的記錄數(shù)高于總記錄10%20%。3)該列只有一個(gè)、兩個(gè)或三個(gè)不同的值。4)被索引的列較長(zhǎng)工
5)維護(hù)索引的開銷超過(guò)了建立索引的價(jià)值。
6.6索引的維護(hù)
(1)重建索引
下面需要重建索引:
1)數(shù)據(jù)和使用模式大幅度變化。2)排序的順序發(fā)生改變。
3)要進(jìn)行大量插入操作或已經(jīng)完成
4)使用大塊I/O的查詢的磁盤讀次比預(yù)料的要多.
5)由于大量數(shù)據(jù)修改,使得數(shù)據(jù)頁(yè)和索引頁(yè)沒有充分使用而導(dǎo)致空間的使用超出估算。(2)索引統(tǒng)計(jì)信息的更新
下面情況需要運(yùn)行updatestatistics命令:1)數(shù)據(jù)行的插入和刪除修改了數(shù)據(jù)上的分布
2)對(duì)用truncatetable刪除數(shù)據(jù)的表上增加數(shù)據(jù)行。3)修改索引列的值。
習(xí)題:
1)在SQLServer的數(shù)據(jù)庫(kù)中按存儲(chǔ)結(jié)構(gòu)的不同將索引分為兩類:(簇索引)和(非簇索引);2)在使用Createindex語(yǔ)句創(chuàng)建簇索引時(shí)使用關(guān)鍵字(Clustered);建立惟一索引的關(guān)鍵字是()3)查看索引使用的系統(tǒng)存儲(chǔ)過(guò)程(sp_index),為索引更改名稱使用系統(tǒng)存儲(chǔ)過(guò)程(sp_rename)4)下列(A)類型的索引總要對(duì)數(shù)據(jù)進(jìn)行排序
A.聚集索引B.非聚集索引C.組合索引D.惟一索引5)一個(gè)表最多允許有(249)個(gè)非聚集索引6)一個(gè)組合索引最多可包含(16)列
第七章T-SQL程序設(shè)計(jì)、自定義類型、函數(shù)和游標(biāo)
7.1批處理、腳本、注釋與變量7.1.1批處理的概念
批處理就是一個(gè)或多個(gè)相關(guān)SQL語(yǔ)句的集合,用GO語(yǔ)句作為批處理的結(jié)束標(biāo)志。若沒有GO語(yǔ)句,默認(rèn)所有的語(yǔ)句屬于一個(gè)批處理。
SQLServer的程序發(fā)送和編譯以批處理為一個(gè)程序執(zhí)行單元。如果一個(gè)批處理中任何一個(gè)語(yǔ)句有語(yǔ)法錯(cuò)誤,則整個(gè)批處理都不能執(zhí)行,若只是批處理中的某個(gè)語(yǔ)句有很執(zhí)行錯(cuò)誤,則該語(yǔ)句不能執(zhí)行,其他語(yǔ)句仍可以正常執(zhí)行。編寫SQL語(yǔ)句注意事項(xiàng):
1)CreateDefault,Createrule,Createview,CreateProcedure,CreateTrigger,都必須單獨(dú)作為一個(gè)批處理,不能與其他語(yǔ)句放在一個(gè)批處理中。
2)不能創(chuàng)建定義check檢查索引后在同一個(gè)批處理中馬上使用這個(gè)約束。
3)不能把默認(rèn)值或規(guī)則對(duì)象綁定到字段或自定義類型以后,在同一個(gè)批處理中馬上使用它們。
4)在一個(gè)批處理中定義的局變量只在該批處理中有效,不能用于其他批處理。5)批處理結(jié)束語(yǔ)句GO必須單獨(dú)一行,可在其后使用注釋。
6)如果批處理第一個(gè)語(yǔ)句是執(zhí)行存儲(chǔ)過(guò)程,則語(yǔ)句開頭的execute關(guān)鍵字可以省略,否則不允許省略。
7.1.2SQL腳本文件
腳本就是包含一個(gè)或多個(gè)批處理的程序文件。
7.1.3SQL注釋
(1)行內(nèi)注釋:--(2)塊注釋:/**/
7.1.4局部變更和全局變量
分為兩類:局部變量和全局變量(1)局部變量1)聲明定義語(yǔ)法:Declare@變量類型(長(zhǎng)度)說(shuō)明:局部變量必須以@開頭以區(qū)別字段名變量。變量名必須符合標(biāo)識(shí)符的構(gòu)成規(guī)則。變量的數(shù)據(jù)類型可以是系統(tǒng)類型,也可以用戶自定義類型,但不允許是text,ntext和image類型2)賦值Set@變量名=表達(dá)式Select@變量名=表達(dá)式說(shuō)明:Set只能給一個(gè)變量賦值,而select可以給多個(gè)變量賦值。表達(dá)式中可以包含select語(yǔ)句子查詢,但只能是集合函數(shù)返回的單值。且必須用圓括號(hào)括起來(lái)。Select也可以直接使用查詢的單值結(jié)果給局部變量賦值。Select@變量=表達(dá)式或字段from表3)用print、select顯示變量的值語(yǔ)法:Print表達(dá)式Select表達(dá)式說(shuō)明:使用print必須有且只能有一個(gè)表達(dá)式,其值在查詢分析器的消息窗口顯示。Select可以有多個(gè)表達(dá)式,結(jié)果以數(shù)據(jù)表的格式在查詢分析器的柵格顯示。4)作用域
在一個(gè)批處理、一個(gè)存儲(chǔ)過(guò)程或一個(gè)觸發(fā)器內(nèi),其生命周期從定義開始到它遇到第一個(gè)GO語(yǔ)句或者到存儲(chǔ)過(guò)程、觸發(fā)器結(jié)尾結(jié)束。即只在當(dāng)前批處理、存儲(chǔ)過(guò)程或觸發(fā)器內(nèi)有效。(2)全局變量:系統(tǒng)定義的無(wú)參函數(shù)
全局變量是由系統(tǒng)提供的有確定值的變量,用戶不能自定義全局變量,也不能用Set語(yǔ)句業(yè)修改全局變量的值,只可使用全局變量的值。全局變量都是以@@開頭的。@@error@@max_connections:@@connections:@@version@@cursor_rows@@fetch_status最后一次執(zhí)行錯(cuò)誤的SQL語(yǔ)句產(chǎn)生的錯(cuò)誤代碼SQLServer允許多用戶同時(shí)連接的最大數(shù)最近一次啟動(dòng)后已連接或嘗試連接的次數(shù)本地SQLServer服務(wù)器的版本信息得到已打開的游標(biāo)中當(dāng)前存在的記錄行數(shù)游標(biāo)的當(dāng)前狀態(tài)7.2T-SQL流程控制語(yǔ)句7.2.1Begin..End
語(yǔ)法:Begin語(yǔ)句1語(yǔ)句2End說(shuō)明:無(wú)論多少個(gè)語(yǔ)句,放在Begin..end中間就構(gòu)成一個(gè)獨(dú)立的語(yǔ)句塊,被系統(tǒng)當(dāng)作一個(gè)整體單元來(lái)處理。條件的某個(gè)分支或循環(huán)體語(yǔ)句,如果要執(zhí)行兩個(gè)以上的復(fù)合語(yǔ)句,則必須將它們放在Beign..end中間作為一個(gè)單元來(lái)執(zhí)行。7.2.2IF/Else條件語(yǔ)句
語(yǔ)法:IF條件表達(dá)式語(yǔ)句塊1Else語(yǔ)句塊2說(shuō)明:條件表達(dá)式中可包含select子查詢,但必須用圓括號(hào)括起來(lái)。ifexists(select*fromgoodswherestock提示信息=casewheng.Stock>=50then"貨源充足,不需考慮"wheng.Stock>=20then"可以維護(hù),以后再說(shuō)"wheng.Stock>=10then"已經(jīng)不多,準(zhǔn)備進(jìn)貨"wheng.Stock>=0then"馬上缺貨,抓緊進(jìn)貨"wheng.Stock=0then"已經(jīng)缺貨,馬上進(jìn)貨"endfromgoodsgleftjoinV_providervong.id=v.貨號(hào)7.2.4WaitFor暫停語(yǔ)句
語(yǔ)法:WaitForDelay‘時(shí)間’|Time‘時(shí)間’功能:使程序暫停指定時(shí)間后再繼續(xù)執(zhí)行。Delay:指定暫停時(shí)間長(zhǎng)短相對(duì)時(shí)間。Time:指定暫停到什么時(shí)間再重新執(zhí)行程序絕對(duì)時(shí)間!畷r(shí)間’參數(shù)必須是datatime類型的時(shí)間部分,格式為”hh:mm:ss”,不能含有日期部分select程序開始時(shí)間=getdate(),開始的時(shí)間秒數(shù)=Datepart(second,getdate())gowaitfordelay"00:00:20"--延遲20秒select延遲以后的時(shí)間=getdate(),延遲后的時(shí)間秒數(shù)=datepart(second,getdate())go7.2.5While循環(huán)語(yǔ)句
語(yǔ)法:While邏輯條件表達(dá)式Begin循環(huán)體語(yǔ)句系列[break][continue]Enddeclare@iint,@sumintselect@i=1,@sum=0while@i7.3.2創(chuàng)建自定義類型
語(yǔ)法:Sp_addtype數(shù)據(jù)類型名,系統(tǒng)數(shù)據(jù)類型名,Null|NotNull,所有者說(shuō)明:凡是包含帶有長(zhǎng)度的系統(tǒng)數(shù)據(jù)類型,如char(5)必須使用括號(hào)括起來(lái)用戶自定義類型的命名必須惟一,不同名字可以定義相同的類型。execsp_addtypeteletephone,"varchar(24)","notnull"execsp_addtypefax,"varchar(24)","null"7.3.3刪除自定義類型
Sp_dropType自定義數(shù)據(jù)類型名--刪除自定義數(shù)據(jù)類型execsp_droptypefax7.4用戶自定義函數(shù)
SQLServer201*支持三種用戶自定義函數(shù),即標(biāo)量函數(shù)、內(nèi)嵌表值函數(shù)和多語(yǔ)句表值函數(shù)。
7.4.1創(chuàng)建自定義函數(shù)
語(yǔ)法:CreateFunction所有者.函數(shù)名[@參數(shù)名as數(shù)據(jù)類型[=默認(rèn)值]]returns返回值類型[as]Begin函數(shù)體SQL語(yǔ)句Return數(shù)值表達(dá)式End說(shuō)明:自定義函數(shù)必須在當(dāng)前數(shù)據(jù)庫(kù)中定義。函數(shù)名:必須符合標(biāo)符構(gòu)成規(guī)則,必須惟一,所有者默認(rèn)系統(tǒng)管理員dbo.@參數(shù)名:用局部變量定義的形式參數(shù),用于接收調(diào)用函數(shù)時(shí)傳遞過(guò)來(lái)的參數(shù)。調(diào)用與系統(tǒng)標(biāo)準(zhǔn)函數(shù)調(diào)用相同,但必須寫出“所有者名稱.函數(shù)名”并在圓括內(nèi)給出參數(shù)createfunction相對(duì)年齡(@出生年月datetime,@defyearint)returnsintasbeginreturn@defyear-year(@出生年月)endgoselectname,brithday,到201*的年齡=dbo.相對(duì)年齡(brithday,201*)fromemployeewheredbo.相對(duì)年齡(brithday,201*)7.5游標(biāo)的創(chuàng)建與使用7.5.1游標(biāo)的概念
游標(biāo)的主要用途是在T-SQL腳本程序、存儲(chǔ)過(guò)程和觸發(fā)器中對(duì)Select語(yǔ)句返回的結(jié)果集進(jìn)行逐行逐字段處理,把一個(gè)完整的數(shù)據(jù)表按行分開,一行一行地逐一提取記錄,并從這一記錄中逐一提取各項(xiàng)數(shù)據(jù)。
游標(biāo)與變量類似,必須先定義后使用。
游標(biāo)的使用過(guò)程:定義聲明游標(biāo)>打開游標(biāo)從游標(biāo)中提取記錄并分離數(shù)據(jù)關(guān)閉游標(biāo)釋放游標(biāo).
7.5.2定義游標(biāo)
語(yǔ)法:Declare游標(biāo)名Cursor[Forward_only|Scroll][Static|KeySet|Dynamic|Fast_ForWard][Read_Onley|Optimistic][Type_Warning]froselect語(yǔ)句[forUpdate[Of字段]]說(shuō)明:Forward_only:指定該游標(biāo)的順序結(jié)果集,只能用next語(yǔ)向后方式順序提取記錄。SCRoll:滾動(dòng)結(jié)果集可以使用向前、向后或定位方式提取記錄。Static與Insensitive含義相同:在系統(tǒng)Tmepdb數(shù)據(jù)庫(kù)中創(chuàng)建臨時(shí)表存儲(chǔ)游標(biāo)使用的數(shù)據(jù),即游標(biāo)不會(huì)隨基本表內(nèi)容而變化,同時(shí)也無(wú)法通過(guò)游標(biāo)來(lái)更新基本表。KeySet:指定游標(biāo)中列的順序是固定的,并且在tempdb內(nèi)建立一個(gè)KeySet表,基本表數(shù)據(jù)修改時(shí)能返回到游標(biāo)中。如果基本表添加符合游標(biāo)的新記錄時(shí)該游標(biāo)無(wú)法讀取。如果游標(biāo)中的一行被刪除掉,則用游標(biāo)提取時(shí)@@Fetch_status返回-2。Dynamic:游標(biāo)中的數(shù)據(jù)將隨基本表而變化,但需要大量的游標(biāo)資源。Fast_ForWard指定ForWard_Only而且Read_only類型游標(biāo)。使用Fast_Forward參數(shù)則不能同時(shí)使用ForWard_only、Scroll、Optimistic或ForUpdate參數(shù).Optimistic指明若游標(biāo)中的數(shù)據(jù)已發(fā)生變化,則對(duì)游標(biāo)數(shù)據(jù)進(jìn)行更新或刪除時(shí)可能會(huì)導(dǎo)致失敗。Type_Warning:游標(biāo)中的數(shù)據(jù)類型被修改成其他類型時(shí),給客戶端發(fā)送警告。7.5.3打開游標(biāo)
語(yǔ)法:Open[Global]游標(biāo)名說(shuō)明:Global:打開全局游標(biāo)。打開游標(biāo)后,可以使用全局變量@@Error判斷該游標(biāo)是否打開成功。0成功@@Cursor_Rows可得到打開的游標(biāo)中當(dāng)前存在的記錄行數(shù)。其返回值為:0:無(wú)符合條件的記錄或該游標(biāo)已經(jīng)關(guān)閉或翻譯。-1:該游標(biāo)為動(dòng)態(tài)的,記錄行經(jīng)常變動(dòng)無(wú)法確定。n:指定的結(jié)果集已從表中全部讀入,總共n條記錄。-m:指定的結(jié)果集還沒有全部讀入,目前游標(biāo)中有m條記錄。7.5.4用Fetch語(yǔ)句從游標(biāo)中提取數(shù)據(jù)語(yǔ)法:Fetch[next|prior|first|last|absolute{n|@nvar}|relative{n|@nvar}]From[Global]游標(biāo)名[into@變量名]說(shuō)明:在游標(biāo)內(nèi)有一個(gè)游標(biāo)指針Cursor指向游標(biāo)結(jié)果集的某個(gè)記錄行稱為當(dāng)前行,游標(biāo)剛打開時(shí)Cursor指向游標(biāo)結(jié)果集第一行之前。Fetch之后的參數(shù)為提取記錄的方式,可以是以下方式之一:Next:順序向下提取當(dāng)前行的下一行。處理完最后一行,再用FetchNext則Cursor指向結(jié)果集最后一行之后,@@Fetch_status的值為-1.Prior:順序向前提取當(dāng)前記錄的前一行,并將其作為當(dāng)前行。第一次用FetchPrior對(duì)游標(biāo)操作時(shí),沒有返回記錄返回,游標(biāo)指針Cursor為指向第一行之前。First:提取第一條。Last:提取最后一條。Absolute{n|@nvar}:按絕對(duì)位置提取游標(biāo)結(jié)果集的第n或第@nvar條記錄。n為負(fù)提取結(jié)行之前。n為整數(shù)。Relative{n|@nvar}:按相對(duì)位置提取當(dāng)前記錄之后(正數(shù))之前(負(fù)數(shù))的第n或@nvar條記錄。打開游標(biāo)后用@@Fetch_Status檢測(cè)游標(biāo)的當(dāng)前狀態(tài):0:Fetch語(yǔ)句提取記錄成功:-1:失敗或提取記錄不在結(jié)果集內(nèi)-2:被提取的記錄已被刪除或根本不存在。@@Fetch_Status只能檢測(cè)游標(biāo)提取記錄后的狀態(tài),若用循環(huán)條件輸出多條記錄時(shí),必須在循環(huán)之前先用Fetch提取一條記錄。7.5.5關(guān)閉游標(biāo)語(yǔ)法:Close[Global]游標(biāo)名作用:翻譯游標(biāo)中結(jié)果集,解除游標(biāo)記錄行上的游標(biāo)指針。當(dāng)游標(biāo)提取記錄完畢后,應(yīng)及時(shí)關(guān)閉該游標(biāo)釋放結(jié)果集的內(nèi)存空間。游標(biāo)關(guān)閉后,其定義結(jié)構(gòu)仍然存儲(chǔ)在系統(tǒng)中,但不能提取記錄和定位更新,需要時(shí)可以和Open再次打開7.5.6釋放游標(biāo)語(yǔ)法:Deallocate[Global]游標(biāo)名作用:刪除指定的游標(biāo),釋放該游標(biāo)所占用的所有系統(tǒng)資源。declareCsEmployeecursorkeyset--定義游標(biāo)forselectname,sex,age=datediff(yy,brithday,getdate()),departmentfromemployeewheredatediff(yy,brithday,getdate())0beginprint"游標(biāo)記錄數(shù)為:"+convert(varchar(2),@@cursor_rows)declare@xmvarchar(8),@xbnchar,@nlint,@bmnvarchar(5),@rsint,@pjnlintfetchabsolute2fromCsEmployeeinto@xm,@xb,@nl,@bm--提取記錄print"第2條記錄:"+@xm+@xb+@bmfetchrelative2fromCsEmployeeinto@xm,@xb,@nl,@bmprint"后移2條記錄:"+@xm+@xb+cast(@nlaschar(2))+@bmset@rs=0;set@pjnl=0;print"全部記錄為:"fetchfirstfromCsEmployeeinto@xm,@xb,@nl,@bm--先提取第一條記錄while@@fetch_status=0beginprintcast(@rs+1aschar(2))+":"+@xm+@xb+cast(@nlaschar(2))+@bmfetchnextfromCsEmployeeinto@xm,@xb,@nl,@bmset@rs=@rs+1set@pjnl=@pjnl+@nlendprint"實(shí)際統(tǒng)計(jì)記錄數(shù)為"+cast(@rsaschar(2))+"平均年齡為:"+cast(@pjnl/@rsaschar(6))endendelseprint"游標(biāo)打開失敗!"closeCsEmployeedeallocateCsEmployee習(xí)題:
1.什么是批處理批處理用()作結(jié)束樗,建立批處理有哪些注意事項(xiàng)?2.什么是腳本?腳本文件的擴(kuò)展名是(),執(zhí)行腳本的方法是()、()。3.注釋是程序中不被執(zhí)行的正文,其作用是(),SQLServer中的注釋語(yǔ)句有()和()。4.T-SQL的局部變量用()聲明,給變量賦值的語(yǔ)句是()、(),輸出語(yǔ)句是()、()。5.局部變量的作用域是(),從()開始,到()結(jié)束。6.CASE表達(dá)式用于(),它可以用在()地方并根據(jù)條件的不同而返回()。CASE表達(dá)式它不能單獨(dú)執(zhí)行,而只能作為()來(lái)使用。CASE表達(dá)式分為()和()兩種類型。7.執(zhí)行WHILE語(yǔ)句時(shí),當(dāng)條件成立時(shí)(),當(dāng)條件不成立時(shí)()。在循環(huán)體內(nèi)使用BREAK或CONTNUE,可以()。
8.用戶自定義數(shù)據(jù)類型的作用是(),用戶自定義數(shù)據(jù)類型用()語(yǔ)句創(chuàng)建,用()語(yǔ)句刪除。
9.用()語(yǔ)句創(chuàng)建自定義函數(shù),函數(shù)參數(shù)的作用是(),用()指定返回類型,用()指定返回值。
10.定義游標(biāo)用()語(yǔ)句,打開游標(biāo)用(),提取數(shù)據(jù)用(),關(guān)閉用(),釋放刪除用()。11.下列語(yǔ)句能否正確執(zhí)行?為什么?DECLARE@assvarchar(50)SET@ass=’sadfasf’GO
PRINT@ass
12.SQLServer提供的注釋類型有()兩項(xiàng)。
13.@n是使用Declare語(yǔ)句聲明的一個(gè)局部變量,能對(duì)變變量賦值的語(yǔ)句是()。14.閱讀下面T-SQL語(yǔ)句,對(duì)變量賦值時(shí)存在錯(cuò)誤的是()兩項(xiàng)。15.下列()語(yǔ)句可以用來(lái)從WHILE語(yǔ)句塊中退出。
16.要將一組語(yǔ)句執(zhí)行10次。下列()結(jié)構(gòu)可以用來(lái)完成此項(xiàng)任務(wù)。17.有以下代碼:Declare@xintSet@x=1While@x語(yǔ)法:Createprocedure存儲(chǔ)過(guò)程名[;整數(shù)][@形參數(shù)據(jù)類型][Varying][=默認(rèn)值][output][withrecompile|encryption|{recompile,encryption}][forreplication]AsSQL語(yǔ)句系列遵守規(guī)則:名稱標(biāo)識(shí)符的長(zhǎng)度最大為128個(gè)字符,且必須唯一。每個(gè)存儲(chǔ)過(guò)程最多可以使用1024個(gè)參數(shù)。存儲(chǔ)過(guò)程的最大容量有一定的限制。存儲(chǔ)過(guò)程支持多達(dá)32層嵌套。在對(duì)存儲(chǔ)過(guò)程命鋰最和系統(tǒng)存儲(chǔ)過(guò)程區(qū)分。說(shuō)明:可以創(chuàng)建永久存儲(chǔ)過(guò)程,也可以創(chuàng)建一個(gè)在一個(gè)會(huì)話中臨時(shí)使用的局部存儲(chǔ)過(guò)程(名稱前加#),還可以創(chuàng)建一個(gè)在所有會(huì)話中臨時(shí)使用的全局存儲(chǔ)過(guò)程(名稱前加##)整數(shù):可作為同名過(guò)程分組的后綴序號(hào)。同組的過(guò)程將來(lái)可以用一條dropproedure全部刪除@形參:所有數(shù)據(jù)類型都可以作為參數(shù)類型。Varying:僅適用于游標(biāo)參數(shù),指定形參變量可作支持結(jié)果集返回參數(shù)。Recompile:執(zhí)行完存儲(chǔ)過(guò)程后不保留存儲(chǔ)過(guò)程的備份,每次執(zhí)行都需要對(duì)存儲(chǔ)過(guò)程重新編譯。Encryoption:存儲(chǔ)過(guò)程作為數(shù)據(jù)庫(kù)對(duì)象在系統(tǒng)的syscomments表中留下完整的代碼信息,并對(duì)訪問(wèn)這些數(shù)據(jù)的入口進(jìn)行加密。createprocgood_pro1@goodnamenvarchar(8)asselects.datetime,p.pname,g.Name,s.num,s.receivepricefromGoodsgjoinstocksons.goodid=g.Idjoinproviderponp.pid=s.provideridwhereg.name=@goodnameexecgood_pro1"計(jì)算機(jī)"8.1.3用execute執(zhí)行存儲(chǔ)過(guò)程語(yǔ)法:Execute@整型變更=存儲(chǔ)過(guò)程名[參數(shù)列表]8.1.4用execute執(zhí)行SQL語(yǔ)句Execute(@字符串變量|[n]’SQL語(yǔ)句字符串’)exec(N"select*fromgoods")exec("select*fromgoods")8.2.2查看存儲(chǔ)過(guò)程定義查看存儲(chǔ)過(guò)程的定義Sp_helptext存儲(chǔ)過(guò)程名加密看不到查看參數(shù)及一般信息sp_help存儲(chǔ)過(guò)程名查直相關(guān)信息sp_depends存儲(chǔ)過(guò)程名8.2.3修改、刪除存儲(chǔ)過(guò)程修改存儲(chǔ)過(guò)程Alterproc存儲(chǔ)過(guò)程名asSQL語(yǔ)句重命名Sp_rename原名,新名刪除Dropproe存儲(chǔ)過(guò)程名8.3觸發(fā)器的創(chuàng)建和使用8.3.1觸發(fā)器的概念(1)觸發(fā)器
是一段自動(dòng)執(zhí)行的程序,是一種特殊的存儲(chǔ)過(guò)程,其特殊在于:1)不允許使用參數(shù),沒有返回值;2)不允許用戶調(diào)用,當(dāng)對(duì)表進(jìn)行插入、刪除和修改操作時(shí)由系統(tǒng)自動(dòng)調(diào)用并執(zhí)行。
觸發(fā)器可以實(shí)現(xiàn)復(fù)雜的完整性約束:1)擴(kuò)展約束、默認(rèn)值的規(guī)則對(duì)象的完整性檢查。2)自動(dòng)生成數(shù)據(jù)。3)檢查數(shù)據(jù)的修改,防止對(duì)數(shù)據(jù)不正確的修改,保證數(shù)據(jù)表之間數(shù)據(jù)的正確性和一致性。4)自定義復(fù)雜的安全權(quán)限(2)用途和優(yōu)點(diǎn)
實(shí)現(xiàn)數(shù)據(jù)庫(kù)中多個(gè)表的級(jí)聯(lián)修改;檢查數(shù)據(jù)輸入的正確性;檢查數(shù)據(jù)修改的正確性。(3)觸發(fā)器的觸發(fā)方式
在數(shù)據(jù)表中某個(gè)字段設(shè)置觸發(fā)器后,當(dāng)該字段的數(shù)據(jù)被插入、刪除或修改更新時(shí),觸發(fā)器便被激活并自動(dòng)執(zhí)行。
SQLServer按觸發(fā)器被激活的時(shí)機(jī)分為“后觸發(fā)”“替代觸發(fā)”兩種。
1)后觸發(fā):或引發(fā)觸發(fā)器執(zhí)行的語(yǔ)句通過(guò)了各種約束檢查,成功執(zhí)行后才激活并執(zhí)行觸發(fā)器程序。特點(diǎn):若引發(fā)觸發(fā)器執(zhí)行的語(yǔ)句違反了某種約束,該語(yǔ)句不會(huì)執(zhí)行,則后觸發(fā)方式的觸發(fā)也不會(huì)被激活;只能創(chuàng)建在數(shù)據(jù)表上,不能創(chuàng)建在視圖上;一個(gè)表可以有多個(gè)后觸發(fā)觸發(fā)器。
2)替代觸發(fā):若激活觸發(fā)器的語(yǔ)句僅僅起到激活觸發(fā)器的作用,一旦激活觸發(fā)器后該語(yǔ)句即停止執(zhí)行,立即轉(zhuǎn)去執(zhí)行觸發(fā)器的程序邏輯激活觸發(fā)器語(yǔ)句并不被執(zhí)行,相當(dāng)于禁止某種操作。特點(diǎn):保以創(chuàng)建在表上,也可創(chuàng)建在視圖上。一個(gè)表只能有一個(gè)替代觸發(fā)的觸發(fā)器。(4)臨時(shí)表
無(wú)論后觸發(fā)或替代觸發(fā),每個(gè)觸發(fā)器被激活時(shí),系統(tǒng)都自動(dòng)為它們創(chuàng)建兩個(gè)臨時(shí)表inserted和deleted表。
兩個(gè)表的結(jié)構(gòu)與激活觸發(fā)器的原數(shù)據(jù)表結(jié)構(gòu)相同。
用Insert語(yǔ)句插入記錄激活觸發(fā)器時(shí),系統(tǒng)在原表中插入記錄的同時(shí),也自動(dòng)把插入的記錄插入到inserted臨時(shí)表。
用delete語(yǔ)句刪除記錄激活觸發(fā)器時(shí),系統(tǒng)在原表中刪除記錄的同時(shí),會(huì)自動(dòng)把刪除的記錄添加到deleted臨時(shí)表。
有update語(yǔ)句修改數(shù)據(jù)激活觸發(fā)器時(shí),系統(tǒng)在先原的表中刪除其有的記錄,刪除的記錄被添到deleted臨時(shí)表,然后再插入新數(shù)據(jù)記錄,新插入的記錄同時(shí)被插入到inserted臨時(shí)表。
用戶可用select語(yǔ)句查詢這個(gè)臨時(shí)表,但不允許進(jìn)行修改。觸發(fā)器一旦執(zhí)行完成,這個(gè)表將被自動(dòng)刪除。8.3.2創(chuàng)建觸發(fā)器語(yǔ)法:CreateTrigger[擁有者.]觸發(fā)器名On[擁有者.]表名|視圖名{fro|after|insteadof}[inset,update,delete][withencryption][notfromreplication]As[setnocunot]不返回給變更賦值的結(jié)果SQL語(yǔ)句系統(tǒng)[RollbackTransaction]--事務(wù)回滾說(shuō)明:For與alter:相同,創(chuàng)建后觸發(fā)觸發(fā)器Insteadof:創(chuàng)建替代觸發(fā)觸發(fā)器.Withencryption:對(duì)觸發(fā)器文本進(jìn)行加密,禁止查閱修改。Notforreplication:在復(fù)制過(guò)程中,不激活觸發(fā)器操作。Setnocount:觸發(fā)器一般不能有返回值,所以也不應(yīng)該用select語(yǔ)句進(jìn)行查詢或給變量賦值,如果必須使用變量賦值語(yǔ)句,可能在開頭使用該語(yǔ)句避免返回結(jié)果。SQL語(yǔ)句:即可以包含獲得被操作的select語(yǔ)句。后觸方式被操作數(shù)據(jù)一定在inserted或deleted臨時(shí)表中。如果被操作的數(shù)據(jù)是多值的,可用in判斷是否被包含在其中:被操作數(shù)據(jù)in(select被操作字段from臨時(shí)表)如果被操作的數(shù)據(jù)是單值,可用下面語(yǔ)句Select@變量=被操作字段from臨時(shí)表``說(shuō)明:Createtrigger語(yǔ)句必須是一個(gè)批處理的第一條語(yǔ)句。創(chuàng)建觸發(fā)器的權(quán)限默認(rèn)屬于表的所有者,而且不能授權(quán)給其他人。觸發(fā)器不能在臨時(shí)表或系統(tǒng)一是創(chuàng)建,后觸發(fā)也不能創(chuàng)建在視圖上。一個(gè)觸發(fā)器只能創(chuàng)建在一個(gè)表上;一個(gè)表可以有有一個(gè)替代觸發(fā)器和多個(gè)后觸發(fā)器(可以是同一種操作類型,可同時(shí)觸發(fā))由于TruncateTable語(yǔ)句刪除記錄時(shí)不被記入事務(wù)日志,所以該該語(yǔ)句不能激活deleted刪除操作的觸發(fā)器如果外鍵所引用的父表已創(chuàng)建了對(duì)子表級(jí)聯(lián)修改或刪除的觸發(fā)器,則子表不允許創(chuàng)建具有相同動(dòng)作的替代觸發(fā)器。觸發(fā)器的定義中不能有任何create,alter語(yǔ)句。也不允許使用drop刪除語(yǔ)句,也不允許使用下列語(yǔ)句:Grant/restoredatabase/restorelogrevoke/truncatetablecreatetriggerDelGoodsongoodsfordeleteasdeleteSalewheregoodidin(selectidfromdeleted)8.3.4禁用/啟用觸發(fā)器禁用:altertable表名disabletrigger觸發(fā)器名啟用:altertable表名enabletrigger觸發(fā)器名8.4觸發(fā)器的查看、編輯、重命名與刪除查看觸發(fā)器基本信息:Sp_help觸發(fā)器名查看觸發(fā)器定義:sp_helptext觸發(fā)器名查看依賴關(guān)系:sp_depends觸發(fā)器名查看指定表指定類型的觸發(fā)器信息Sp_helpTrigger表名,[insert|update|delete]8.4.3修改和刪除觸發(fā)器修改AlterTrigger[擁有者.]觸發(fā)器名On[擁有者.]表名|視圖名{fro|after|insteadof}[inset,update,delete][withencryption][notfromreplication]As[setnocunot]不返回給變更賦值的結(jié)果SQL語(yǔ)句系統(tǒng)[RollbackTransaction]--事務(wù)回滾刪除Droptrigger觸發(fā)器名第九章SQLServer的權(quán)限管理與代理服務(wù)臺(tái)9.1SQLServer的安全機(jī)制
SQLServer201*的安全性管理是建立在認(rèn)證和訪問(wèn)許可兩者機(jī)制上的。
在SQLServer的安全模型中包括幾個(gè)部分:SQLServer登錄,數(shù)據(jù)庫(kù)用戶,權(quán)限,角色。9.1.1SQLServer登錄認(rèn)證簡(jiǎn)介
SQLServer參在兩種安全模式下運(yùn)行:Windows認(rèn)證模式和混合混式。
SQLServer認(rèn)證模式下,用戶在SQLServer時(shí)必須提供登錄名和登錄密碼,SQLServer自己執(zhí)行認(rèn)證處理,它將會(huì)與存儲(chǔ)在系統(tǒng)表syslogins中的登錄信息驗(yàn)證。9.2.2使用T-SQL管理SQLServer登錄(1)sp_addlogin創(chuàng)建新的使用SQLServer認(rèn)證模式登錄帳號(hào):Sp_addlogin‘登錄名’,’登錄密碼’,’默認(rèn)數(shù)據(jù)庫(kù)’,’默認(rèn)語(yǔ)言’其中登錄名和密碼可包含1128個(gè)字符,由字母、漢字和數(shù)據(jù)組成。不能包含\\,保留的登錄名稱sa或已存在的登錄名,也不能是空字符串或null.execsp_addlogin"User1","User1","pubs","us_english"(2)sp_droplogin刪除登錄帳號(hào),禁止防問(wèn)SQLServerSp_droplogin‘登錄名稱’execsp_droplogin"User1"不能刪除系統(tǒng)管理者sa以及當(dāng)前連接到SQLServer的登錄;如果與登錄相匹配的用戶仍存在sysusers表中,則不能刪除該登錄帳號(hào);sp_addlogin和sp_droplogin只能在用SQLServer認(rèn)證模式下。(3)sp_grantLogin設(shè)WindowsNT用戶或用戶組為SQLServer登錄者Sp_grantlogin‘登錄名稱’(4)sp_denylogn拒絕NT用戶或用戶組連接到SQLServer。Sp_grantlogin‘登錄名稱’(5)sp_revokelogin刪除NT用戶或用戶組在SQLServer上的登錄信息。Sp_revokelogin‘登錄名稱’(6)sp_helplogins顯示SQLServer所有登錄者的信息,包括每一個(gè)數(shù)據(jù)庫(kù)里與該登錄者相對(duì)應(yīng)的用戶名稱。Sp_helplogins‘登錄名’9.3數(shù)據(jù)庫(kù)用戶
數(shù)據(jù)庫(kù)用戶用來(lái)指出哪一個(gè)人可以訪問(wèn)哪一個(gè)數(shù)據(jù)庫(kù)。在一個(gè)數(shù)據(jù)庫(kù)中用戶ID惟一標(biāo)識(shí)一個(gè)用戶,用戶對(duì)數(shù)據(jù)的訪問(wèn)權(quán)限以及對(duì)數(shù)據(jù)庫(kù)對(duì)象的所有關(guān)系都是通過(guò)用戶帳號(hào)來(lái)控制的。用戶帳號(hào)總是基于數(shù)據(jù)庫(kù)的,即兩個(gè)不同數(shù)據(jù)庫(kù)中可以有兩個(gè)相同的用戶帳號(hào)。
在數(shù)據(jù)庫(kù)中用戶帳號(hào)與登錄登錄是兩個(gè)不同概念。一個(gè)合法的登錄帳號(hào)表明該帳號(hào)通過(guò)了NT認(rèn)證或SQLServer認(rèn)證,但不能表明其可以對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)和數(shù)據(jù)對(duì)象進(jìn)行某種或某些操作,所以一個(gè)登錄帳號(hào)總是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)用戶帳號(hào)相對(duì)尖,這樣才可以訪問(wèn)數(shù)據(jù)庫(kù)。通過(guò),數(shù)據(jù)庫(kù)用戶帳號(hào)總是與某一登錄帳號(hào)相關(guān)聯(lián),但有一個(gè)例那guest.在安裝系統(tǒng)時(shí)guest用戶被加入到master,pubs,tempdb和northwoind中。
用戶通過(guò)NT或SQLServer認(rèn)證成功登錄到SQLServer之后,SQLServer又做了哪些事呢?1)SQLServer檢查該登錄用戶是否有合法的用戶名,如果有合法的用戶,則允許其以用戶名訪問(wèn)數(shù)據(jù)庫(kù);否則,執(zhí)行第二步。2)SQLServer檢查是否有g(shù)uest用戶,如果有,則允許登錄用戶以guest用戶來(lái)訪問(wèn)數(shù)據(jù)庫(kù),如果沒有,則該登錄用戶被拒絕。
Grust用戶主要是讓那些沒有屬于自己的用戶帳號(hào)的SQLServer登錄者把其用為默認(rèn)用戶,從而使該登錄者能夠訪問(wèn)具有g(shù)uest用戶的數(shù)據(jù)庫(kù)。9.3.2管理數(shù)據(jù)庫(kù)用戶1)創(chuàng)建新的數(shù)據(jù)庫(kù)用戶Sp_grantdbaccess‘登錄帳號(hào)名’,’用戶帳號(hào)名稱’2)刪除數(shù)據(jù)庫(kù)用戶]Sp_revokedbaccess‘用戶帳號(hào)名稱’3)查看數(shù)據(jù)庫(kù)用戶信息Sp_helpuser‘用戶帳號(hào)名稱’9.4權(quán)限管理
T-SQL命名規(guī)則
1表名
XXX相關(guān)表以r_作為前綴,YYY相關(guān)表以t_作為前綴。如r_acc、t_bcc。后臺(tái)表名盡量與前臺(tái)表名相同,后臺(tái)獨(dú)有的表應(yīng)以_b作為后綴。如r_gggd_b。
命名應(yīng)盡量反映存儲(chǔ)的數(shù)據(jù)內(nèi)容。
2視圖名
視圖以v_作為前綴。由于前臺(tái)無(wú)視圖,故不需加_b。命名應(yīng)盡量體現(xiàn)各視圖的功能。3觸發(fā)器名
觸發(fā)器名為相應(yīng)的表名加上后綴,Insert觸發(fā)器加"_i",Delete觸發(fā)器加"_d",Update觸發(fā)器加"_u",如:r_bch_i,r_bch_d,r_bch_u。
4存儲(chǔ)過(guò)程名
存儲(chǔ)過(guò)程應(yīng)以"sp_"開頭,后續(xù)部分主要以動(dòng)賓形式構(gòu)成,并用下劃線分割各個(gè)組成部分。如增加BSC機(jī)架的DRT單板的存儲(chǔ)過(guò)程為"sp_ins_board_drt"。5變量名
變量名采用小寫,若屬于詞組形式,用下劃線分隔每個(gè)單詞,如@my_err_no。6命名中其他注意事項(xiàng)
以上命名都不得超過(guò)30個(gè)字符的系統(tǒng)限制。變量名的長(zhǎng)度限制為29(不包括標(biāo)識(shí)字符@)。
數(shù)據(jù)對(duì)象、變量的命名都采用英文字符。禁止使用中文命名。
編程結(jié)構(gòu)和描述
SQLSERVER系統(tǒng)中,一個(gè)批處理是從客戶傳給服務(wù)器的一個(gè)完整的包,可以包含若干條SQL語(yǔ)句。批處理中的語(yǔ)句是作為一組去進(jìn)行語(yǔ)法分析、編譯和執(zhí)行的。觸發(fā)器、存儲(chǔ)過(guò)程等數(shù)據(jù)對(duì)象則是將批處理永久化的方法。
注釋:注釋可以包含在批處理中。在觸發(fā)器、存儲(chǔ)過(guò)程中包含描述性注釋將大大增加文本的可讀性和可維護(hù)性。本規(guī)范建議:
1、注釋以英文為主。實(shí)際應(yīng)用中,發(fā)現(xiàn)以中文注釋的SQL語(yǔ)句版本在英文環(huán)境中不可用。為避免后續(xù)版本執(zhí)行過(guò)程中發(fā)生某些異常錯(cuò)誤,建議使用英文注釋。
2、注釋盡可能詳細(xì)、全面。
創(chuàng)建每一數(shù)據(jù)對(duì)象前,應(yīng)具體描述該對(duì)象的功能和用途。
傳入?yún)?shù)的含義應(yīng)該有所說(shuō)明。如果取值范圍確定,也應(yīng)該一并說(shuō)明。取值有特定含義的變量(如boolean類型變量),應(yīng)給出每個(gè)值的含義。
3、注釋語(yǔ)法包含兩種情況:?jiǎn)涡凶⑨尅⒍嘈凶⑨?/p>
單行注釋:注釋前有兩個(gè)連字符(--),最后以行尾序列(CR-LF)結(jié)束。一般,對(duì)變量、條件子句可以采用該類注釋。多行注釋:符號(hào)/*和*/之間的內(nèi)容為注釋內(nèi)容。對(duì)某項(xiàng)完整的操作建議使用該類注釋。4、注釋簡(jiǎn)潔,同時(shí)應(yīng)描述清晰。
函數(shù)注釋:編寫函數(shù)文本--如觸發(fā)器、存儲(chǔ)過(guò)程以及其他數(shù)據(jù)對(duì)象--時(shí),必須為每個(gè)函數(shù)增加適當(dāng)注釋。該注釋以多行注釋為主,主要結(jié)構(gòu)如下:
/*************************************************************************name:--函數(shù)名*function:--函數(shù)功能*input:--輸入?yún)?shù)*output:--輸出參數(shù)*author:--作者*CreateDate:--創(chuàng)建時(shí)間*UpdateDate:--函數(shù)更改信息(包括作者、時(shí)間、更改內(nèi)容等)*************************************************************************/
CREATEPROCEDUREsp_xxx
條件執(zhí)行語(yǔ)句ifelse
條件語(yǔ)句塊(statenemtblock,以beginend為邊界)僅在if子句的條件為真時(shí)才被執(zhí)行。為提高代碼的可讀性,建議嵌套不多于5層。還有,當(dāng)嵌套層次太多時(shí),應(yīng)該考慮是否可以使用case語(yǔ)句。重復(fù)執(zhí)行while和跳轉(zhuǎn)語(yǔ)句goto
需要多次執(zhí)行的語(yǔ)句,可以使用while結(jié)構(gòu)。其中,控制while循環(huán)的條件在任何處理開始之前需要先執(zhí)行一次。循環(huán)體中的保留字break無(wú)條件的退出while循環(huán),然后繼續(xù)處理后續(xù)語(yǔ)句;保留字continue重新計(jì)算while條件,如果條件為真,則從循環(huán)開始處重新執(zhí)行各語(yǔ)句。
使用跳轉(zhuǎn)語(yǔ)句goto和標(biāo)簽label也可以方便地實(shí)現(xiàn)循環(huán)和其他更靈活的操作。SQLSERVER僅具有單通道語(yǔ)法分析器,因此不能解析對(duì)尚未創(chuàng)建的對(duì)象所做的前向參考。換言之,跳轉(zhuǎn)到某標(biāo)簽的后續(xù)語(yǔ)句應(yīng)該是可執(zhí)行的(如不存在可能尚未創(chuàng)建的數(shù)據(jù)對(duì)象)。書寫格式
數(shù)據(jù)庫(kù)服務(wù)器端的觸發(fā)器和存儲(chǔ)過(guò)程是一類特殊的文本,為方便開發(fā)和維護(hù),提高代碼的易讀性和可維護(hù)性。規(guī)范建議按照分級(jí)縮進(jìn)格式編寫該文本。順序執(zhí)行的各命令位于同一級(jí);條件語(yǔ)句塊(statenemtblock,以beginend為邊界)位于下一級(jí),類推。
SQL語(yǔ)句是該文本的主體。為適應(yīng)某些教復(fù)雜的用戶需求,SQL語(yǔ)句可能比較龐大。為方便閱讀和維護(hù),規(guī)范建議按照SQL語(yǔ)句中系統(tǒng)保留字的關(guān)鍵程度再劃分為三級(jí)。具體分級(jí)請(qǐng)參照下表。其中,非系統(tǒng)保留字(如字段名、數(shù)據(jù)表名、標(biāo)點(diǎn)符號(hào))相對(duì)本級(jí)保留字再縮進(jìn)一級(jí)。多個(gè)連續(xù)的非保留字可以分行書寫,也可以寫在同一行。當(dāng)WHERE包含的條件子句教復(fù)雜時(shí),應(yīng)該每行只寫一個(gè)條件分句,并為重要的條件字句填寫單行注釋。
在保證基本縮進(jìn)格式的前提下,可以通過(guò)對(duì)齊某些重要關(guān)鍵字(如條件關(guān)鍵字AND、OR,符號(hào)=、等)來(lái)進(jìn)一步提高文本的易讀性和可維護(hù)性。相鄰兩級(jí)的縮進(jìn)量為10個(gè)空格。這也是ISQL編輯器默認(rèn)的文本縮進(jìn)量。另外,在ISQL編輯器中,一個(gè)TAB鍵也相當(dāng)于10個(gè)空格。注:按照功能,四類SQL語(yǔ)句(SELECT、INSERT、UPDATE、DELETE)的關(guān)鍵字可以劃分為三類:主關(guān)鍵字、次關(guān)鍵字、一般關(guān)鍵字。如下表所示:主關(guān)鍵字次關(guān)鍵字一般關(guān)鍵字
SELECTINSERT(INTO)UPDATEDELETE
FROMWHEREVALUESINSERTSELECTFROM語(yǔ)句中的SELECT和FROMANDORBETWEENINLIKE字體
系統(tǒng)保留字應(yīng)大寫,包括系統(tǒng)公共變量等。其他字符(如用戶自定義變量、用戶自定義數(shù)據(jù)對(duì)象名)小寫。需要特殊強(qiáng)調(diào)的部分可以大寫。一條完整注釋語(yǔ)句的首字符應(yīng)大寫。對(duì)某變量、某條件字句的注釋可以全部使用小寫。
SQLServer單詞表
單詞Primarykey主鍵含義單詞Identity含義自動(dòng)編號(hào)
友情提示:本文中關(guān)于《SQLServer總結(jié)》給出的范例僅供您參考拓展思維使用,SQLServer總結(jié):該篇文章建議您自主創(chuàng)作。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。