一.事務

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