SQL學(xué)習(xí)總結(jié)
上個(gè)星期,自主學(xué)習(xí)了SQLServer,基本了解了SQLServer的語(yǔ)法知識(shí)和結(jié)構(gòu),對(duì)SQL有了一定的認(rèn)識(shí),現(xiàn)在我就對(duì)我這一星期對(duì)SQl的學(xué)習(xí)做一個(gè)總結(jié):為了永久性的集中存放數(shù)據(jù),并且還能體現(xiàn)數(shù)據(jù)與數(shù)據(jù)之間聯(lián)系.此時(shí)需要用到數(shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù).由于之前也接觸過(guò)一兩種數(shù)據(jù)庫(kù),向Oracle,MySQL,再就是SQLServer,這三種都是關(guān)系型數(shù)據(jù)庫(kù),都是用于存儲(chǔ)大量的數(shù)據(jù)信息,是一種存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù)。不過(guò),不管是哪一種數(shù)據(jù)庫(kù),他們之間的聯(lián)系我覺(jué)得都是相通的,對(duì)于數(shù)據(jù)庫(kù)的常見(jiàn)操作,無(wú)非就是“三建四句“。所謂的“三建四句“就是說(shuō),三建:建庫(kù),建表,建約束;四句:增,刪,改,查。SQL語(yǔ)言,也稱(chēng)為結(jié)構(gòu)化查詢(xún)語(yǔ)言,是用于訪(fǎng)問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的專(zhuān)用語(yǔ)言,同樣也是數(shù)據(jù)庫(kù)的核心語(yǔ)言,總體上可以分為三類(lèi):數(shù)據(jù)操縱語(yǔ)言(DML),數(shù)據(jù)定義語(yǔ)言(DDL)、數(shù)據(jù)控制語(yǔ)言(DCL)。數(shù)據(jù)操縱語(yǔ)言(DML)主要有四種形式:插入:insert更新:update刪除:delete查詢(xún):select,涉及到數(shù)據(jù)的完整性簡(jiǎn)單查詢(xún)、子查詢(xún)、多表連接查詢(xún)數(shù)據(jù)定義語(yǔ)言(DDL)主要用于創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象
數(shù)據(jù)庫(kù)數(shù)據(jù)表
視圖:是一種觀察數(shù)據(jù)的途徑索引:用于查詢(xún)數(shù)據(jù),提高效率同義詞
Create,Drop,Alert,Truncate(截?cái)啵⿺?shù)據(jù)控制語(yǔ)言(DCL):是用于授予和回收訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的某種權(quán)限,并對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控。Grant(授予),Revoke(回收),Denny(拒絕),RollbackSQL中的運(yùn)算符:算術(shù)運(yùn)算符、位運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、通配運(yùn)算符、字符串連接符、賦值運(yùn)算符上面這些只是SQLServer數(shù)據(jù)的基本操作,而它真正強(qiáng)大的地方并不止這些,還有程序設(shè)計(jì),SQLServer中的編程語(yǔ)言就是T-SQL語(yǔ)言,是一種非過(guò)程化的語(yǔ)言。觸發(fā)器:觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,主要是通過(guò)實(shí)踐進(jìn)行觸發(fā)而被執(zhí)行。它的主要作用就是能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的
參照完整性和數(shù)據(jù)的一致性。
存儲(chǔ)過(guò)程:(storedprocedure)類(lèi)似c語(yǔ)言中的函數(shù),是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)來(lái)執(zhí)行它。游標(biāo):游標(biāo)是一種能從包含多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。將批操作變成行操作,對(duì)結(jié)果集中得某行進(jìn)行操作。
擴(kuò)展閱讀:SQL學(xué)習(xí)總結(jié)
SQL總結(jié)
1.插入,刪除,修改(語(yǔ)法)
(插入)INSERT[INTO][列名]VALUES(更新)UPDATESET=[WHERE]
(刪除)DELETE[FROM][WHERE]注意
插入語(yǔ)句
如果沒(méi)有能很好的記住字段在表中的順序最好是寫(xiě)上列名
2.條件查詢(xún)
SelectFrom
WhereOrder
3給字段取別名as用法
使用AS來(lái)為列其別名
Select學(xué)號(hào)asstudentNO,姓名asname,家庭地址asaddressFromstudentinfo
Where家庭地址‘黑龍江哈爾濱’使用=來(lái)為列另起別名
Select‘姓名’=firstName+‘.’+lastnamefromemployees注意:1.+連接字符數(shù)據(jù),結(jié)果為字符串?dāng)?shù)據(jù)的連接2.如果+連接數(shù)值型,結(jié)果為數(shù)值的和
4.函數(shù)
字符串函數(shù)函數(shù)名CharindexLenLowerUpperLtrimRtrimRightReplaceStudiff描述用來(lái)尋找一個(gè)指定的字符在另一個(gè)字符串中的起始位置返回傳遞給它的字符串長(zhǎng)度將傳遞給他的字符串變成小寫(xiě)將傳遞給他的字符串變成大寫(xiě)清空字符左邊的空格清空字符右邊的空格替換一個(gè)字符串中的字符在一個(gè)字符串中,刪除指定例如SELECTCHARINDEX(‘lucia",’Iamlucia")返回:6Selectlen(‘sql’)Selectlower(‘SQL’)返回sqlSelectltrim(‘你好’)返回你好Selectreplace(‘連玉龍’,‘龍’,‘鳳")返回:連玉鳳Selectstudiff("ABCDEFG",2,3,"我的音‘瑪麗蓮.夢(mèng)露,2’)夢(mèng)露從字符串右邊返回指定數(shù)目字符Selectright(長(zhǎng)度的字符,并在該位置插入一個(gè)新的字符串樂(lè)我的世界")返回:A我的音樂(lè)我的世界EFG日期函數(shù)GetdateDateaddDatediffDatenameDatepart
數(shù)學(xué)函數(shù)ConvertCurrent_userDatalengthHost_name備注:
日期函數(shù)中datediff可以用來(lái)計(jì)算時(shí)間差(例如,年齡)getdate()用來(lái)設(shè)置默認(rèn)這些函數(shù)容易記也容易忘,尤其是書(shū)寫(xiě)的格式規(guī)范。
用來(lái)轉(zhuǎn)變數(shù)據(jù)類(lèi)型返回當(dāng)前用戶(hù)的名字給指定表達(dá)式的字節(jié)數(shù)返回當(dāng)前用戶(hù)所登錄的計(jì)算機(jī)名字Selectconvert(varchar(5),1234)Selectcurrent_user,返回你登錄的用戶(hù)名Selectdatalegth(‘中國(guó)’)Selectuser_name(1)返回:從任何數(shù)據(jù)庫(kù)中返回‘a(chǎn)bo’取得當(dāng)前的系統(tǒng)日期將指定的數(shù)值添加到指定的日期后面的日期兩個(gè)日期之間的指定日期日期中指定日期部分的字符串日期中指定日期部分的整數(shù)形式Selectgetdate()Selectdateadd(mm,4,’01/01/1999’)返回05/01/19999Selectdatediff(mm,’01/01/1999’,’05/01/1999’)Selectdatename(dw,‘01/01/201*’)Selectdatepart(day,‘01/15/201*’)5like用法
*通配符
*%包含零個(gè)或更多字符串*_(下劃線(xiàn))任何單個(gè)字符
*[]指定范圍([a-f])或集合[abcdf]中任何的一個(gè)單個(gè)字符*[^]不屬于指定范圍[a-f]或集合[abcdef]的任何單個(gè)字符例
SELECT*FROM數(shù)據(jù)表
WHERE編號(hào)LIKE‘00[^8]%[AC]%’
可能會(huì)查詢(xún)出的編號(hào)值為(a)。
A、0090ACDB、007_AFFC、008&DCGD、008C6.聚合函數(shù)
*Count(),*Max(),*Min(),*Avg(),sum()
6.1分組查詢(xún)groupbyhavingSelect任職部門(mén),count(*)Fromlucia工作室
Where目前的薪資>=201*Groupby任職部門(mén)Havingcount(*)>4
7.多表查詢(xún)
*innerjoin內(nèi)連接:兩張表的順序顛倒對(duì)結(jié)果沒(méi)有影響*leftjoin左連接:左邊的表是主表,表的順序不能顛倒*rightjoin右連接:右邊的表是主表,表的順序不能顛倒例
SELECTS.姓名,C.課程編號(hào),C.筆試成績(jī)FROMStudentInfoASSINNERJOINScoreInfoASCONC.學(xué)號(hào)=S.學(xué)號(hào)
8.建表的三大范式
第一范式的目標(biāo)是確保每列的原子性
如果每列都是不可再分的最小數(shù)據(jù)單元(也稱(chēng)為最小的原子單元),則滿(mǎn)足第一范式(1NF)
如果一個(gè)表中個(gè)字段關(guān)系滿(mǎn)足1NF,并且除了主鍵以外的其它列,都依賴(lài)于該主鍵,則滿(mǎn)足第二范式(2NF)
第二范式要求每個(gè)表只描述一件事情(去除不依賴(lài)主鍵或部分依賴(lài)主鍵的列)
由第二范式可知:產(chǎn)品價(jià)格不是依賴(lài)訂單的編號(hào)如果一個(gè)關(guān)系滿(mǎn)足2NF,并且除了主鍵以外的其它列都不傳遞依賴(lài)于主鍵列,則滿(mǎn)足第三范式(3NF)
第三范式的目標(biāo)是確保每列都直接依賴(lài)主鍵
由第三范式可知:產(chǎn)品的結(jié)果是依賴(lài)產(chǎn)品編號(hào)而不是直接依賴(lài)訂單編號(hào)的
9.主鍵(primarykey),外鍵(foreignkey)創(chuàng)建/添加語(yǔ)法
ConstraintPK_主鍵名稱(chēng)primarykey(主鍵名稱(chēng))
ConstraintFK_外鍵的名稱(chēng)foreignkey(外鍵名稱(chēng))References父表(父表字段)修改
Altertable子表
AddConstraintFK_外鍵的名稱(chēng)foreignkey(外鍵名稱(chēng))References父表(父表字段)
(b)其他約束:唯一約束
AlterconstraintUQ_stuIDunique(stuID)默認(rèn)約束
AlterconstraintDF_addressdefault("地址不詳")foraddress檢查約束
AlterconstraintCK_stuAgecheck(stuAgebetween15and40)
10變量(局部變量,全局變量)
局部變量
*聲明局部變量
DECLARE@變量名數(shù)據(jù)類(lèi)型*賦值
*SET@變量名=值*SELECT@變量名=值全局變量
是系統(tǒng)的,是不能改變的較常用的是:變量@@ERROR@@IDENTITY@@LANGUAGE@@MAX_CONNECTIONS@@ROWCOUNT@@SERVERNAME@@TRANCOUNT@@VERSION變量含義最后一個(gè)T-SQL錯(cuò)誤的錯(cuò)誤號(hào)最后一次插入的標(biāo)識(shí)值當(dāng)前使用的語(yǔ)言的名稱(chēng)可以創(chuàng)建的同時(shí)連接的最大數(shù)目受上一個(gè)SQL語(yǔ)句影響的行數(shù)本地服務(wù)器的名稱(chēng)當(dāng)前連接打開(kāi)的事務(wù)數(shù)SQLServer的版本信息11.if……else,while,caseend,whenthen用法例題
=============ifelse===================
ifexists(select*fromsysobjectswherename="NewTable")droptableNewTable
select姓名,S.學(xué)號(hào),筆試成績(jī),機(jī)試成績(jī),
是否通過(guò)=case
when筆試成績(jī)>60and機(jī)試成績(jī)>60then1else0
endintoNewTablefromstudentinfoassleftjoinscoreinfoascons.學(xué)號(hào)=c.學(xué)號(hào)go
==============while===================declare@writtenAvgdecimaldeclare@labavgdecimal
select@writtenAvg=avg(筆試成績(jī))fromstudentscoreselect@labavg=avg(機(jī)試成績(jī))fromstudentscoreif(@writtenAvg>@labavg)begin
print("筆試成績(jī)大于機(jī)試成績(jī)")while(1=1)begin
updatestudentscoreset機(jī)試成績(jī)=機(jī)試成績(jī)+1if(selectmax(機(jī)試成績(jī))fromstudentscore)>=97breakendendelsebegin
print("機(jī)試成績(jī)大于筆試成績(jī)")while(1=1)begin
updatestudentscoreset筆試成績(jī)=筆試成績(jī)+1if(selectmax(筆試成績(jī))fromstudentscore)=97breakendendgo
select*fromstudentscorego
============caseend==============select姓名,學(xué)號(hào),筆試成績(jī)=case
when筆試成績(jī)isnullthen"缺考"elseconvert(varchar(5),筆試成績(jī))end,機(jī)試成績(jī)=casewhen機(jī)試成績(jī)isnullthen"缺考"elseconvert(varchar(5),機(jī)試成績(jī))end,是否通過(guò)=casewhen是否通過(guò)=1then"是"when是否通過(guò)=0then"否"endfromNewTablego
===========whenthen=====================ifexists(select*fromsysobjectswherename="NewTable")droptableNewTable
select姓名,S.學(xué)號(hào),筆試成績(jī),機(jī)試成績(jī),是否通過(guò)=case
when筆試成績(jī)>60and機(jī)試成績(jī)>60then1else0end
intoNewTablefromstudentinfoassleftjoinscoreinfoascons.學(xué)號(hào)=c.學(xué)號(hào)go
select*fromnewTable
12子查詢(xún)(in,exists)
SELECT姓名FROMStudentInfoWHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)FROMScoreInfo)GO注意:
基本上in可以等價(jià)于“=”可是“=”只能是子查詢(xún)返回的是單個(gè)結(jié)果,如果是多個(gè)查詢(xún)結(jié)果只能用in
Exists用法用例:
IFEXISTS(SELECT*FROMsysdatabasesWHEREname=‘LuciaBank")DROPDATABASELuciaBank
14存儲(chǔ)過(guò)程
優(yōu)點(diǎn):
執(zhí)行的速度更快
允許模塊化程序設(shè)計(jì)提高系統(tǒng)安全性減少網(wǎng)絡(luò)流通量14.1分類(lèi)
系統(tǒng)存儲(chǔ)過(guò)程
“sp_”或者是“XP_”常用系統(tǒng)存儲(chǔ)過(guò)程
Sp_database:列出服務(wù)器上的所有數(shù)據(jù)庫(kù)
Sp_helpdb:報(bào)告有關(guān)指定數(shù)據(jù)庫(kù)或所有數(shù)據(jù)庫(kù)的信息Sp_rename:更改數(shù)據(jù)庫(kù)的名稱(chēng)
Sp_tables:返回當(dāng)前環(huán)境下可查詢(xún)的對(duì)象的列表sp_columns:返回某個(gè)表列的信息sp_help:查看某個(gè)表的所有信息sp_helpconstraint:查看某個(gè)表的約束sp_helpindex:查看某個(gè)表的索引
sp_password:添加或修改登錄帳戶(hù)的密碼sp_helptext:顯示默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶(hù)定義的存儲(chǔ)過(guò)程、觸發(fā)器或視圖的實(shí)際文本
14.2自定義的存儲(chǔ)過(guò)程
14.2.1定義存儲(chǔ)過(guò)程的語(yǔ)法和調(diào)用的語(yǔ)法
CREATEPROC[EDURE]存儲(chǔ)過(guò)程名@參數(shù)1數(shù)據(jù)類(lèi)型=默認(rèn)值OUTPUT,……,
@參數(shù)n數(shù)據(jù)類(lèi)型=默認(rèn)值OUTPUTAS
SQL語(yǔ)句
調(diào)用的語(yǔ)法
EXEC過(guò)程名[參數(shù)]
14.2.2不帶參數(shù)的存儲(chǔ)過(guò)程
/*------------------------------------------------------存儲(chǔ)過(guò)程(不帶參數(shù))
題目:查看本次考試的平均分?jǐn)?shù),并查看沒(méi)有通過(guò)的學(xué)生的名單----------------------------------------------------------*/createprocedurep_scoreInfoas
declare@writtenAvgdecimaldeclare@labAvgdecimal
select@writtenAvg=avg(筆試成績(jī)),@labAvg=avg(機(jī)試成績(jī))fromstudentscoreprint"筆試成績(jī)的平均分"+convert(nvarchar(5),@writtenAvg)print"機(jī)試成績(jī)的平均分"+convert(nvarchar(5),@labAvg)if(@writtenAvg>60and@labAvg>60)print"本班的成績(jī)優(yōu)秀"else
print"本班的成績(jī)很差"
print"-------------------------------------------------------"print"本班成績(jī)不及格的人名單"
selects.學(xué)號(hào),姓名,筆試成績(jī),機(jī)試成績(jī)fromstudentinfos,studentscorecwheres.學(xué)號(hào)=c.學(xué)號(hào)and筆試成績(jī)可以規(guī)定及格的分?jǐn)?shù)
-----------------------------------------------------------------*/createprocedureproc_scoreinfoHaveParams(
@writePassdecimal,--默認(rèn)值是60@labPassdecimal)as
declare@writtenAvgdecimaldeclare@labAvgdecimal
select@writtenAvg=avg(筆試成績(jī)),@labAvg=avg(機(jī)試成績(jī))fromstudentscoreprint"筆試成績(jī)的平均分"+convert(nvarchar(5),@writtenAvg)print"機(jī)試成績(jī)的平均分"+convert(nvarchar(5),@labAvg)if(@writtenAvg>@writePassand@labAvg>@labPass)print"本班的成績(jī)優(yōu)秀"else
print"本班的成績(jī)很差"
print"-------------------------------------------------------"print"本班成績(jī)不及格的人名單"
selects.學(xué)號(hào),姓名,筆試成績(jī),機(jī)試成績(jī)fromstudentinfos,studentscorecwheres.學(xué)號(hào)=c.學(xué)號(hào)and筆試成績(jī)@labPass)print"本班的成績(jī)優(yōu)秀"else
print"本班的成績(jī)很差"print"-------------------------------------------------------"
select@sumNotPass=count(*)fromstudentscorewhere筆試成績(jī)=3
print"本班成績(jī)不及格的人數(shù)是"+convert(varchar(5),@sum)+"及格人太少,及格分?jǐn)?shù)要在調(diào)低"else
print"及格人數(shù)適中,及格分?jǐn)?shù)線(xiàn)可以"dropprocproc_outputscoreInfogo
14.2.4RAISERROR用法語(yǔ)法:
RAISERROR(msg_id|msg_str,severity,stateWITHoption[,...n]])msg_id:在sysmessages系統(tǒng)表中指定用戶(hù)定義錯(cuò)誤信息msg_str:用戶(hù)定義的特定信息,最長(zhǎng)255個(gè)字符
severity:定義嚴(yán)重性級(jí)別。用戶(hù)可使用的級(jí)別為018級(jí)state:表示錯(cuò)誤的狀態(tài),1至127之間的值
option:指示是否將錯(cuò)誤記錄到服務(wù)器錯(cuò)誤日志中/*--------------------------------------------------------------帶參數(shù)(輸出)的存儲(chǔ)過(guò)程
題目:查看本次考試的平均分?jǐn)?shù),并查看沒(méi)有通過(guò)的學(xué)生的人數(shù)當(dāng)輸入的及格分?jǐn)?shù)不再1到100之間則報(bào)錯(cuò)
-----------------------------------------------------------------*/declare@sumint,@tint
execproc_outputscoreInfo@sumoutput,80set@t=@@error
print"錯(cuò)誤號(hào):"+convert(nvarchar(10),@t)if@t0
raiserror("及格線(xiàn)錯(cuò)誤,請(qǐng)重新輸入(1100之間)",16,1)return
print"***************************************"if@sum>=3
print"本班成績(jī)不及格的人數(shù)是"+convert(varchar(5),@sum)+"及格人太少,及格分?jǐn)?shù)要在調(diào)低"else
print"及格人數(shù)適中,及格分?jǐn)?shù)線(xiàn)可以"dropprocproc_outputscoreInfogo
15事物15.1事物概念
事務(wù)(TRANSACTION)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作這些操作作為一個(gè)整體一起向系統(tǒng)提交,要么都執(zhí)行、要么都不執(zhí)行事務(wù)是一個(gè)不可分割的工作邏輯單元15.2事物四個(gè)屬性
原子性(Atomicity):事務(wù)是一個(gè)完整的操作。
事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行
一致性(Consistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致?tīng)顟B(tài)隔離性(Isolation):對(duì)數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明
事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴(lài)于或影響其他事務(wù)永久性(Durability):事務(wù)完成后,它對(duì)數(shù)據(jù)庫(kù)的修改被永久保持,事務(wù)日
志能夠保持事務(wù)的永久性
15.3管理事務(wù)T_SQL語(yǔ)句
開(kāi)始事務(wù):beigintransaction提交事務(wù):committransaction回滾事物:rollbacktransaction15.4判斷出錯(cuò)的語(yǔ)句@@ERROR
15.5事務(wù)的分類(lèi):
顯性事務(wù):用BEGINTRANSACTION明確指定事務(wù)的開(kāi)始,這是最常用的
事務(wù)類(lèi)型
隱性事務(wù):通過(guò)設(shè)置SETIMPLICIT_TRANSACTIONSON語(yǔ)句,將隱性事
務(wù)模式設(shè)置為打開(kāi),下一個(gè)語(yǔ)句自動(dòng)啟動(dòng)一個(gè)新事務(wù)。當(dāng)該事務(wù)完成時(shí),再下一個(gè)T-SQL語(yǔ)句又將啟動(dòng)一個(gè)新事務(wù)
自動(dòng)提交事務(wù):這是SQLServer的默認(rèn)模式,它將每條單獨(dú)的T-SQL語(yǔ)
句視為一個(gè)事務(wù),如果成功執(zhí)行,則自動(dòng)提交;如果錯(cuò)誤,則自動(dòng)回滾
15.6例題
-----------------------------------轉(zhuǎn)賬事物處理
--------------------------------begintransactiondeclare@errorcountintset@errorcount=0
updateclientAccountset余額=余額-1000where賬號(hào)="6226900707220987"set@errorcount=@errorcount+@@error
updateclientAccountset余額=余額+1000WHERE賬號(hào)="6226900707220654"set@errorcount=@errorcount+@@errorif@errorcount0begin
print"交易失敗,回滾事物"rollbacktransactionendelsebeginprint"交易成功"
committransactionendgo
print"查看轉(zhuǎn)賬事物后余額"
select*fromBankAccountgo
16索引(提高查詢(xún)速度,但是占空間)是SQLServer編排數(shù)據(jù)的內(nèi)部方法
16.1索引的類(lèi)型
唯一索引:唯一索引不允許兩行具有相同的索引值
主鍵索引:為表定義一個(gè)主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類(lèi)
型。主鍵索引要求主鍵中的每個(gè)值是唯一的,并且不能為空
聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個(gè)表
只能有一個(gè)
非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲(chǔ)在一個(gè)位置,
索引存儲(chǔ)在另一個(gè)位置,索引中包含指向數(shù)據(jù)存儲(chǔ)位置的指針?梢杂卸鄠(gè),小于249個(gè)
16.2語(yǔ)法
CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEXindex_name
ONtable_name(column_name…)[WITHFILLFACTOR=x]
UNIQUE表示唯一索引,可選
CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選
FILLFACTOR表示填充因子,指定一個(gè)0到100之間的值,值指示索引頁(yè)填滿(mǎn)的空間所占的百分比16.3索引創(chuàng)建的指定原則
請(qǐng)按照下列標(biāo)準(zhǔn)選擇建立索引的列
該列用于頻繁搜索
該列用于對(duì)數(shù)據(jù)進(jìn)行排序
請(qǐng)不要使用下面的列創(chuàng)建索引:
列中僅包含幾個(gè)不同的值
表中僅包含幾行。為小型表創(chuàng)建索引可能不太劃算,因?yàn)镾QLServer在索
引中搜索數(shù)據(jù)所花的時(shí)間比在表中逐行搜索所花的時(shí)間更長(zhǎng)
17視圖
概念:視圖是一張?zhí)摂M表,它表示一張表的部分?jǐn)?shù)據(jù)或多張表的綜合數(shù)據(jù),其結(jié)構(gòu)和數(shù)據(jù)是建立在對(duì)表的查詢(xún)基礎(chǔ)上17.1視圖的用途
篩選表中的行
防止未經(jīng)許可的用戶(hù)訪(fǎng)問(wèn)敏感數(shù)據(jù)降低數(shù)據(jù)庫(kù)的復(fù)雜程度將多個(gè)物理數(shù)據(jù)庫(kù)抽象為一個(gè)邏輯數(shù)據(jù)庫(kù)
17.2語(yǔ)法
CREATEVIEWview_nameAS
17.3例題
-------------------------------------------------
----創(chuàng)建CS_KC視圖,包括雇員名字,部門(mén)名字、其選修的課程號(hào)及成績(jī)收入在之間的雇員號(hào)碼
--------------------------------------------------createviewCS_KCas
selecte.nameas顧員姓名,d.departmentnameas部門(mén)名稱(chēng),e.EmployeeIDas雇員編號(hào)fromEmployeesase,Departmentsasd,Salaryasswheres.Incomebetween201*and3000and
e.departmentID=d.departmentIDande.employeeID=s.employeeID
18觸發(fā)器
觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,類(lèi)似于事件函數(shù),SQLServer允許為INSERT、UPDATE、DELETE創(chuàng)建觸發(fā)器,即當(dāng)在表中插入、更新、刪除記錄時(shí),觸發(fā)一個(gè)或一系列T-SQL語(yǔ)句。
18.1語(yǔ)法
創(chuàng)建觸發(fā)器用:CREATETRIGGERCREATETRIGGER觸發(fā)器名稱(chēng)ON表名
FORINSERT、UPDATE或DELETEAS
T-SQL語(yǔ)句
18.2觸發(fā)器中用到兩個(gè)臨時(shí)表:Deleted和Inserted
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中有兩個(gè)虛擬表用于存儲(chǔ)在表中記錄改動(dòng)的信息,分別是:Deleted,Inserted
虛擬表Inserted
表記錄新增時(shí),用來(lái)存放新增的數(shù)據(jù)記錄表記錄更新時(shí),用來(lái)存放更新的新記錄表記錄刪除時(shí),不存儲(chǔ)任何信息
虛擬表Deleted
表記錄新增時(shí),不存放任何記錄
表記錄更新時(shí),用來(lái)存放更新前的記錄表記錄刪除時(shí),用來(lái)存放刪除前的數(shù)據(jù)記錄
18.4例題
-----------------------------------------------------------
--修改Departments表departmentID字段值時(shí),該字段在Employees表中的對(duì)應(yīng)值也應(yīng)修改;
-----------------------------------------------------------------createtriggerdeparmentsudateondepartmentsforupdateasbegin
if(columns_updated()&01)>0
updateemployeessetdepartmentID=(selectins.departmentIDfrominsertedins)wheredepartmentID=(selectdepartmentIDfromdeleted)end
----------------------------------------------------------1.向Employees表添加一記錄時(shí),該記錄的departmentID值在
--Departments表中應(yīng)存在createtriggeremployeesinsertonemployees-------------------------------------------------------------createtriggeremployeesinsertonemployeesforinsertupdateasbegin
if((selectins.departmentidfrominsertedins)notin(selectdepartmentidfromdepartments))rollbackend
------------------------------------------------------------------------1.3.刪除Departments表中一記錄時(shí),該記錄departmentID字段值在Employees表中對(duì)應(yīng)的記錄也應(yīng)刪除
---------------------------------------------------------------------createtriggerdepartmentsdeleteondepartmentsfordeleteasbegin
deletefromemployeeswheredepartmentID=(selectdepartmentIDfromdeleted)endgo
友情提示:本文中關(guān)于《SQL學(xué)習(xí)總結(jié)》給出的范例僅供您參考拓展思維使用,SQL學(xué)習(xí)總結(jié):該篇文章建議您自主創(chuàng)作。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。