數(shù)據(jù)庫的事務(wù)、索引、視圖(zrf)_第1頁
數(shù)據(jù)庫的事務(wù)、索引、視圖(zrf)_第2頁
數(shù)據(jù)庫的事務(wù)、索引、視圖(zrf)_第3頁
數(shù)據(jù)庫的事務(wù)、索引、視圖(zrf)_第4頁
數(shù)據(jù)庫的事務(wù)、索引、視圖(zrf)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

事務(wù)、索引和視圖回顧下列T-SQL語句有錯嗎?實現(xiàn)了什么功能?

SELECT*FROMSWHERESIDIN(SELECT*FROMSC)

上述語句可以用下面的連接替換嗎?

SELECT*FROMSINNERJOINSCONS.SID=SC.SID下列語句實現(xiàn)了什么功能?SELECT*FROMSWHERESIDNOTIN(SELECTSIDFROMSC)

上述語句可以用下面的連接替換嗎?SELECT*FROMSINNERJOINSCONS.SID<>SC.SID

SELECTSIDFROMSC

可以

查看沒有參加考試的學(xué)員

有的子查詢不能用連接替換。這就是典型的例子回顧下列語句實現(xiàn)了什么功能?

SELECT*FROMSWHEREEXISTS(SELECT*FROMSCWHERESID=S.SID)請使用IN子查詢改寫上述語句?請使用連接改寫上述語句

查詢參加考試的學(xué)員SELECT*FROMSWHERESIDIN(SELECTSIDFROMSC)SELECT*FROMSINNERJOINSCONS.SID=SC.SID目標(biāo)理解事務(wù)的概念掌握如何創(chuàng)建事務(wù)掌握如何創(chuàng)建索引掌握如何創(chuàng)建并使用視圖為什么需要事務(wù)銀行轉(zhuǎn)賬例如,銀行轉(zhuǎn)賬問題:假定資金從賬戶A轉(zhuǎn)到賬戶B,至少需要兩步:賬戶A的資金減少然后賬戶B的資金相應(yīng)增加賬戶A賬戶B假定張三的賬戶直接轉(zhuǎn)賬1000元到李四的賬戶為什么需要事務(wù)CREATETABLEbank(customerNameCHAR(10),--顧客姓名

currentMoneyMONEY--當(dāng)前余額)GOALTERTABLEbank

ADDCONSTRAINTCK_currentMoneyCHECK(currentMoney>=1)GOINSERTINTObank(customerName,currentMoney)VALUES('張三',1000)INSERTINTObank(customerName,currentMoney)VALUES('李四',1)創(chuàng)建賬戶表,存放用戶的賬戶信息添加約束:根據(jù)銀行規(guī)定,賬戶余額不能少于1元,否則視為銷戶張三開戶,開戶金額為1000元;李四開戶,開戶金額1元為什么需要事務(wù)目前兩個賬戶的余額總和為:1000+1=1001元為什么需要事務(wù)模擬實現(xiàn)轉(zhuǎn)賬:

從張三的賬戶轉(zhuǎn)賬1000元到李四的賬戶/*--轉(zhuǎn)賬測試:張三轉(zhuǎn)賬1000元給李四--*/--我們可能會這樣這樣編寫語句--張三的賬戶少1000元,李四的賬戶多1000元UPDATEbankSETcurrentMoney=currentMoney-1000WHEREcustomerName='張三'UPDATEbankSETcurrentMoney=currentMoney+1000WHEREcustomerName='李四'GO--再次查看轉(zhuǎn)賬后的結(jié)果。SELECT*FROMbankGO請問:

執(zhí)行轉(zhuǎn)賬語句后,張三、李四的賬戶余額為多少?張三的賬戶沒有減少但李四的賬戶卻多了1000元1000+1001=2001元

總額多出了1000元!為什么需要事務(wù)--張三的賬戶減少1000元,李四的賬戶增加1000元UPDATEbankSETcurrentMoney=currentMoney-1000WHEREcustomerName='張三'UPDATEbankSETcurrentMoney=currentMoney+1000WHEREcustomerName='李四'GO錯誤原因分析:UPDATE語句違反約束:

余額>=1元執(zhí)行失敗,所以張三還是1000元繼續(xù)往下執(zhí)行:執(zhí)行成功,所以李四變?yōu)?001元如何解決呢?使用事務(wù)什么是事務(wù)事務(wù)(TRANSACTION)是作為單個邏輯工作單元執(zhí)行的一系列操作這些操作作為一個整體一起向系統(tǒng)提交,要么都執(zhí)行、要么都不執(zhí)行事務(wù)是一個不可分割的工作邏輯單元轉(zhuǎn)賬過程就是一個事務(wù)。它需要兩條UPDATE語句來完成,這兩條語句是一個整體,如果其中任一條出現(xiàn)錯誤,則整個轉(zhuǎn)賬業(yè)務(wù)也應(yīng)取消,兩個賬戶中的余額應(yīng)恢復(fù)到原來的數(shù)據(jù),從而確保轉(zhuǎn)賬前和轉(zhuǎn)賬后的余額不變,即都是1001元。事務(wù)的特性事務(wù)必須具備以下四個屬性,簡稱ACID屬性:原子性(Atomicity):事務(wù)是一個完整的操作。事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行一致性(Consistency):當(dāng)事務(wù)完成時,數(shù)據(jù)必須處于一致狀態(tài)隔離性(Isolation):對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)永久性(Durability):事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性如何創(chuàng)建事務(wù)T-SQL使用下列語句來管理事務(wù):開始事務(wù):BEGINTRANSACTION提交事務(wù):COMMITTRANSACTION回滾(撤銷)事務(wù):ROLLBACKTRANSACTION一旦事務(wù)提交或回滾,則事務(wù)結(jié)束。判斷某條語句執(zhí)行是否出錯:使用全局變量@@ERROR;@@ERROR只能判斷當(dāng)前一條T-SQL語句執(zhí)行是否有錯,為了判斷事務(wù)中所有T-SQL語句是否有錯,我們需要對錯誤進(jìn)行累計;如:SET@errorSum=@errorSum+@@error如何創(chuàng)建事務(wù)了解事務(wù)的分類:顯示事務(wù):用BEGINTRANSACTION明確指定事務(wù)的開始,這是最常用的事務(wù)類型隱性事務(wù):通過設(shè)置SETIMPLICIT_TRANSACTIONSON語句,將隱性事務(wù)模式設(shè)置為打開,下一個語句自動啟動一個新事務(wù)。當(dāng)該事務(wù)完成時,再下一個T-SQL語句又將啟動一個新事務(wù)自動提交事務(wù):這是SQLServer的默認(rèn)模式,它將每條單獨的T-SQL語句視為一個事務(wù),如果成功執(zhí)行,則自動提交;如果錯誤,則自動回滾……關(guān)鍵語句講解………BEGINTRANSACTION

/*--定義變量,用于累計事務(wù)執(zhí)行過程中的錯誤--*/DECLARE@errorSumINTSET@errorSum=0--初始化為0,即無錯誤/*--轉(zhuǎn)賬:張三的賬戶少1000元,李四的賬戶多1000元*/UPDATEbankSETcurrentMoney=currentMoney-1000WHEREcustomerName='張三'SET@errorSum=@errorSum+@@errorUPDATEbankSETcurrentMoney=currentMoney+1000WHEREcustomerName='李四'SET@errorSum=@errorSum+@@error--累計是否有錯誤如何創(chuàng)建事務(wù)使用事務(wù)解決銀行轉(zhuǎn)賬問題開始事務(wù)(指定事務(wù)從此處開始,后續(xù)的T-SQL語句都是一個整體)累計是否有錯誤IF@errorSum<>0--如果有錯誤

BEGINprint'交易失敗,回滾事務(wù)'ROLLBACKTRANSACTIONENDELSEBEGINprint'交易成功,提交事務(wù),寫入硬盤,永久的保存'

COMMITTRANSACTION

ENDGOprint'查看轉(zhuǎn)賬事務(wù)后的余額'SELECT*FROMbankGO如何創(chuàng)建事務(wù)根據(jù)是否有錯誤,確定事務(wù)是提交還是撤銷如果有錯,則回滾操作,事務(wù)結(jié)束如果成功,則提交操作,事務(wù)結(jié)束如何創(chuàng)建事務(wù)轉(zhuǎn)賬事務(wù)前轉(zhuǎn)賬事務(wù)過程中轉(zhuǎn)賬事務(wù)結(jié)束后演示:轉(zhuǎn)賬1000,轉(zhuǎn)賬失敗的情況如何創(chuàng)建事務(wù)轉(zhuǎn)賬事務(wù)前轉(zhuǎn)賬事務(wù)過程中轉(zhuǎn)賬事務(wù)結(jié)束后演示:轉(zhuǎn)賬800,轉(zhuǎn)賬成功的情況什么是索引漢語字典中的漢字按頁存放,一般都有漢語拼音目錄(索引)、偏旁部首目錄等我們可以根據(jù)拼音或偏旁部首,快速查找某個字詞IndexesUseKeyValuestoLocateData(根據(jù)索引鍵查找定位數(shù)據(jù)行)

DataPages(數(shù)據(jù)頁)…IndexPages(索引頁)

什么是索引什么是索引SQLServer中的數(shù)據(jù)也是按頁(4KB)存放索引:是SQLServer編排數(shù)據(jù)的內(nèi)部方法。它為SQLServer提供一種方法來編排查詢數(shù)據(jù)。索引頁:數(shù)據(jù)庫中存儲索引的數(shù)據(jù)頁;索引頁類似于漢語字(詞)典中按拼音或筆畫排序的目錄頁。索引的作用:通過使用索引,可以大大提高數(shù)據(jù)庫的檢索速度,改善數(shù)據(jù)庫性能。索引類型唯一索引:唯一索引不允許兩行具有相同的索引值主鍵索引:為表定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,并且不能為空聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲在一個位置,索引存儲在另一個位置,索引中包含指向數(shù)據(jù)存儲位置的指針??梢杂卸鄠€,小于249個如何創(chuàng)建索引

演示使用企業(yè)管理器創(chuàng)建如何創(chuàng)建索引CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]

INDEXindex_nameONtable_name(column_name…)[WITHFILLFACTOR=x]UNIQUE表示唯一索引,可選CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選FILLFACTOR表示填充因子,指定一個0到100之間的值,該值指示索引頁填滿的空間所占的百分比

使用T-SQL語句創(chuàng)建索引的語法:唯一索引聚集索引或非聚集索引填充因子(系數(shù)):指定一個0~100之間的值,表示索引頁填充的百分比USEstuDBGOIFEXISTS(SELECTnameFROMsysindexesWHEREname='IX_writtenExam')

DROPINDEXstuMarks.IX_writtenExam/*--筆試列創(chuàng)建非聚集索引:填充因子為30%--*/CREATENONCLUSTEREDINDEXIX_writtenExamONstuMarks(writtenExam)

WITHFILLFACTOR=30GO/*指定按索引IX_writtenExam查詢*/SELECT*FROMstuMarks(INDEX=IX_writtenExam)WHEREwrittenExamBETWEEN60AND90如何創(chuàng)建索引

在stuMarks表的writtenExam列創(chuàng)建索引:檢測索引是否存在:

索引存放在系統(tǒng)表sysindexes中索引的優(yōu)缺點優(yōu)點加快訪問速度加強(qiáng)行的唯一性缺點帶索引的表在數(shù)據(jù)庫中需要更多的存儲空間操縱數(shù)據(jù)的命令需要更長的處理時間,因為它們需要對索引進(jìn)行更新創(chuàng)建索引的指導(dǎo)原則請按照下列標(biāo)準(zhǔn)選擇建立索引的列。該列用于頻繁搜索該列用于對數(shù)據(jù)進(jìn)行排序請不要使用下面的列創(chuàng)建索引:列中僅包含幾個不同的值。表中僅包含幾行。為小型表創(chuàng)建索引可能不太劃算,因為SQLServer在索引中搜索數(shù)據(jù)所花的時間比在表中逐行搜索所花的時間更長什么是視圖CREATEVIEWview_stuInfo_stuMarksASSELECT姓名=stuName,

學(xué)號=stuInfo.stuNo,…基于學(xué)員信息表和成績表創(chuàng)建視圖教員需要的視圖:

方便查看學(xué)員的成績班主任需要的視圖:

方便查看學(xué)員的檔案什么是視圖視圖是一張?zhí)摂M表,它表示一張表的部分?jǐn)?shù)據(jù)或多張表的綜合數(shù)據(jù),其結(jié)構(gòu)和數(shù)據(jù)是建立在對表的查詢基礎(chǔ)上視圖中并不存放數(shù)據(jù),而是存放在視圖所引用的原始表(基表)中同一張原始表,根據(jù)不同用戶的不同需求,可以創(chuàng)建不同的視圖什么是視圖視圖的用途篩選表中的行防止未經(jīng)許可的用戶訪問敏感數(shù)據(jù)降低數(shù)據(jù)庫的復(fù)雜程度將多個物理數(shù)據(jù)庫抽象為一個邏輯數(shù)據(jù)庫如何創(chuàng)建視圖演示使用企業(yè)管理器創(chuàng)建視圖如何創(chuàng)建視圖使用T-SQL語句創(chuàng)建視圖的語法CREATEVIEWview_name

AS<select語句>如何創(chuàng)建視圖創(chuàng)建方便教員查看成績的視圖IFEXISTS(SELECT*FROMsysobjectsWHERE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論