一.事務
1.什麼是事務:事務是一種機制,一個操做序列,它包含一組數據庫的操做命令。並把全部命令做爲一個總體一塊兒向系統提交或撤銷操做請求
,要麼這些數據庫操做都執行,要不都不執行。同生共死同進退,事務是一個不可分割的總體。
2:事務的四種特性:原子性、一致性、隔離性、持久性
3:如何執行事務操做:1.開始事務:begin transaction
2.提交事務:commit transaction
3.回滾事務:rollback transaction
例如:轉帳問題假定張三的帳戶直接轉帳1000元到李四的帳戶上:
1 use mybank 2 create table bank 3 ( 4 cardId int primary key identity(1,1) not null, 5 cardowner nvarchar(10) not null, 6 moneyNum money 7 ) 8 go 9 alter table bank 10 add constraint CK_moneyNum check(moneyNum>=1) 11 go 12 insert into bank 13 values('張三',1000) 14 insert into bank 15 values('李四',1) 16 set nocount on 17 print '查看轉帳前的餘額' 18 select * from bank 19 go 20 begin transaction 21 --定義變量,用於累加事務執行中出現的錯誤 22 declare @errorSum int 23 set @errorSum=0 24 update bank set moneyNum-=1000 where cardId=1 25 set @errorSum+=@@error 26 update bank set moneyNum+=1000 where cardId=2 27 set @errorSum+=@@ERROR 28 print '查看轉帳中的餘額' 29 select * from bank 30 if(@errorSum<>0) 31 begin 32 print '交易失敗,回滾事務' 33 rollback transaction 34 end 35 else 36 begin 37 print '交易成功,提交事務' 38 commit transaction 39 end 40 go 41 print '查詢帳戶餘額' 42 select * from bank 43 go
消息爲:結果爲:
4:事物的分類:
1:顯式事務:用begin transaction明確指定事物的開始(本身動手寫的)
2:隱式事務:經過設置set implicit_transaction on 語句將隱式事務模式設置打開.當隱式事務操做時,SQL Server將在提交或回滾後自動啓動新事務.不準描述開始,記得提交和回滾
3:自定義事務:將單獨的T-SQL語句默認爲一個事物.
二.視圖
視圖本質:視圖是一張虛擬表,真正保存的是一堆SQL語句
建立視圖的語法:
create view view_name
as
<SQL語句>
刪除視圖的語法:
drop view view_name
查看視圖數據的語法:
select col_name1,col_name2,col_name3..........from view_name
例:使用T-SQL語句爲教員建立查看'oop'課程最近一次考試成績的視圖,並經過視圖查詢結果
1 use MySchool 2 go 3 if exists(select * from sysobjects where name='vw_studentresult') 4 drop view vw_studentresult 5 go 6 create view vw_studentresult 7 as 8 select 姓名=Studentname,學號=student.studentNo,成績=studentresult, 9 課程名稱=subjectname,考試日期=examdate 10 from student,Result,Subject 11 where subject.SubjectId=(select SubjectId from Subject where SubjectName='oop') 12 and examdate=(select max(ExamDate) from Result where SubjectId=(select SubjectId from Subject where SubjectName='oop')) 13 go 14 select * from vw_studentresult
查詢結果如圖所示:
問題:能不能對視圖進行增刪改操做:(考試能夠,面試不行)
視圖能夠嵌套
視圖中的select後不能跟(
Order by ,除非有top關鍵字
不能有into
引用臨時表或者是變量).
三.什麼是索引:
1.索引:是SQL Server編排數據的內部方法。它爲SQL Server提供一種方法來編排查詢數據
2.索引分類:惟一索引、主鍵索引、彙集索引、非彙集索引、複合索引、全文索引
3.使用T-SQL語句建立索引:
create unique clustered|nonclustered index indexname
on table (column_name[,column_name]...)
[with fillfactor=x]
4.刪除索引:drop index table_name.index_name
例:爲學生姓名建立非彙集索引
--建立索引 2 if exists(select name from sysindexes where name='IX_studentname') 3 drop index.student.IX_studentname 4 create nonclustered index IX_studentname 5 on student(studentname) 6 with fillfactor=30 7 go 8 --查看數據 9 select * from Student 10 with (index=IX_studentname) 11 where StudentName like '張%'
如圖結果爲:
查看索引:
用系統儲存過程sp_helpindex查看
sp_helpindex table_name
用視圖sys.indexes查看
select * from sys.indexes
一.存儲過程定義:
接收在數據庫服務器上存儲的預先編譯好的一堆SQL語句
二.存儲過程的優勢:
1.執行速度快(預編譯:能夠當作編譯後的中間代碼,存儲過程將會在SQL SERVER服務器上進行預編譯)
2.容許模式化程序設計
3.安全性更高
4.減小網絡流量
三.存儲過程的分類:
1.系統存儲過程:通常以sp開頭(stored Procedure),由sql server 建立.管理和使用,存放在resource數據庫中,相似於C#中的方法.
2.擴展存儲過程:通常以xp開頭,使用編輯語言(如C#)建立的外部存儲過程,以DELL的形式單獨存在.
3.用戶自定義存儲過程:通常以usp開頭,由用戶在本身的數據庫中建立的存儲過程(相似於C#中自定義的方法).
四.經常使用的系統存儲過程:
sp_databases 列出服務器上的全部數據庫
exec sp_databases
sp_helpdb 報告有關指定數據庫或全部數據庫的信息
sp_renamedb 更改數據庫的名稱
sp_tables 返回當前環境下可查詢的對象的列表
sp_columns 返回某個表列的信息
sp_help 查看某個表的全部信息
sp_helpconstraint 查看某個表的約束
sp_helpindex 查看某個表的索引
sp_stored_procedures 列出當前環境中的全部存儲過程
sp_password 添加或修改登陸賬戶的密碼
sp_helptext 顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本
五.用戶自定義的存儲過程
語法:
Create Procedure usp_info
as
select
注意:1.參數置於as前,且不用declare關鍵字
2.as後的變量須要declare關鍵字
六.帶參數的存儲過程
1 alter procedure usp_GetStuResult 2 @PassScore int=90, 3 @name nvarchar(20) 4 --as以前給參數 5 as 6 if(@PassScore>=0 and @PassScore<=100) 7 begin 8 select studentname,studentresult 9 from student,result 10 where student.studentno=result.studentno 11 and 12 studentresult>@PassScore 13 end 14 else 15 begin 16 raiserror('及格線輸入有誤',16,1) 17 end 18 19 --開始測試存儲過程書寫是否存在問題 20 exec usp_GetStuResult @name='張三'
raiserror用法:
raiserror返回用戶定義的錯誤信息時,可指定嚴重級別.設置系統變量記錄所發生的錯誤
七.帶output參數的存儲過程:
1 alter proc usp_getpaglist 2 @pageindex, int--當前是第幾頁 3 @pagesize,--每頁的記錄數 4 @totalpages int output--總頁數 5 as 6 select * from 7 ( 8 select * ,row_number()over(order by studentno)as myid 9 from student 10 )as tmp 11 where myid between(@pageindex-1)*@pagesize+1 and@ pageindex * @pagesize 12 --總記錄數=總記錄數/@pagesize 13 declare @totalrecord int 14 select @totalrecord =count(1) from student 15 set @totalpages =ceiling( @totalrecord *1.0/@pagesize) 16 --調用 17 declare @pages int 18 set @pages=0 19 exec usp_getpagelist 1,3@pages output 20 print @pages