數據庫的高級應用
數據庫五大高級應用:
視圖(view)索引(index)存儲過程(proc)觸發器(trigger)事務(trans)
●●●●●●●●●●●●下面將對這五大應用詳細解●●●●●●●●●●●●
一 視圖(view):只是用來快速展示查詢數據:
主要內容:
l 視圖的概念以及優缺點
視圖是一張虛擬表,他所展現的內容並沒有存儲在視圖表中而是存儲在他所引用的表中。
優點; 簡化操作;根據不同用戶定制不同數據;合並分割數據;安全性;
缺點:性能不高;數據修改受限;
l 單表視圖 多表視圖 基於視圖的視圖
創建視圖 語法結構:
Create view 視圖名[(column ,```````)]--column 列名
[with encryption ]
As
[With check option]--這條語句作用:1 規定在視圖上做過的修改必須符合引用表的要求;2 通過視圖修改的數據可以確保修改后的數據仍然可以通過視圖看到。
注意點:視圖中的查詢語句中不能包含 order by/ compute /compute by 或者是into關鍵字
例子:1單表視圖
創建視圖 create view jiage
As select *from Car where Price between 30 and 50
go
引用 :select *from jiage
2帶有where 字段的視圖
Create view view2
As
Select 姓名,工資 from 職工 where 工資>1800
Go
3帶有計算字段的視圖
Go
2 多表視圖
3 帶有聚合函數的視圖
4更改原表中的字段名稱
create view view1 (車名,車的價格) --將新設置的列名在此設置。
as
select name,price from Car where Name like'%寶馬%'
go
select *from view1
l 利用sql 代碼修改視圖
alter view view1 (啥車,多錢) --可以同時更改原有視圖中的列名
as
select name,price from Car where Name like '%奧迪%'
go
select *from view1
l 利用sql 刪除 視圖
《刪除單張視圖》 drop view 視圖名 《刪除多張視圖》 drop view view1,view2~~~~
《帶有判斷條件刪除視圖》
l 視圖數據的查詢
l 通過視圖添加更新以及刪除數據
二 索引(index)
創建索引:create [unique][clustered][nonclustered] index index-name1 on [table|view](列名 asc|desc)
Unique 創建唯一索引,即索引的鍵值不能重復,在列包含重復值是不能創建唯一索引;
Clustered 指明創建的索引為簇索引,如果此選項默認,則創建的為非簇索引。
Nonclustered 指明創建的索引為非簇索引
例子: 1創建普通索引create index idex-scl on 倉庫備份(面積)
2創建多列普通索引 create index idex-sc2 on 倉庫備份(城市,創建時間)
3 刪除索引 drop index 表名.索引名 drop index 倉庫備份.index1
三存儲過程(proc)
主要內容:
l 存儲過程的分類以及優點
定義:為了完成特定功能的sql集合,編譯后存儲在服務器端數據庫中,利用存儲過程可以加速sql 語句的執行。
存儲過程可以分為兩類:系統存儲過程和自定義存儲過程。
系統存儲過程:系統存儲過程是在sql 成功安裝后存在系統數據庫master 中的,這些存儲過程是以sp- 為前綴命名的,主要功能是在系統表中獲取信息,系統管理員可以通過簡單的調用系統存儲過程完成復雜的管理工作,調用系統存儲過程時在其他非master數據庫中也可以調用 。
自定義存儲過程:有用戶自己定義完成特定功能,返回值只能表明返回值執行是否成功而且只能利用 想、execute 完成存儲過程。
優點: 1 提高應用程序的通用性和可移植性 2 可以更有效的管理用戶操作數據庫的權限3 可以提高sql的速度 4 減輕服務器的負擔。
l 創建並執行存儲過程
語法結構:
Create procedure 過程名
@ming 參數類型 output
~~
~~~
As
Begin 命令塊 end
創建完成后利用execute 過程名 [參數值~~][output]
例子:1功能為求0-5之間的和
alter proc proc3
as
declare @sum int,@a int
select @a=0,@sum=0
while @a<6
begin
set @sum=@sum+@a
set @a=@a+1
End
print '和是'+cast(@sum as varchar)
Go
Exectute proc3
功能2 判斷系統商品庫存 以及購買者賬戶金額 決定交易是否進行
create proc shuiguo2
@idss varchar(10),
@buyer varchar(10),
@shuliang int
as
--判斷庫存
if (select numbers from Fruit where Ids=@idss)>@shuliang
begin
if(select price from Fruit where Ids=@idss )*@shuliang>(select account from Login where UserName=@buyer )
begin
--減庫存
update fruit set numbers=numbers-@shuliang where Ids=@idss
--減余額
update Login set Account=Account-(select price from Fruit)*@shuliang where UserName=@buyer
end
else
begin
print'余額不足,請充值!'
end
end
else
begin
print'抱歉,庫存不足!'
end
go
功能3 不帶參數的存儲過程
4帶輸入參數的存儲過程
5帶有輸入參數的數據查詢功能的存儲過程
6帶有輸入輸出參數的存儲過程
7帶有登陸判斷功能的存儲過程
8 帶有判斷條件的插入功能的存儲過程(exists)
9帶有判斷條件的刪除功能的存儲過程
10 帶有判斷條件的更新功能的存儲過程
11加密存儲過程
Create proc 過程名
With encryption
As 命令塊 Go
★ 查看存儲過程的屬性以及功能代碼信息
execute sp_help proc3 --查詢存儲過程的屬性信息
execute sp_depends proc1--查詢存儲過程所使用的數據對象的信息,如果沒有引用或者加密會提示 沒有引用.
execute sp_helptext proc3--查詢存儲過程的功能代碼,如果加密后不能被查詢到
select name from car where type ='p'--能共查找本表創建存儲過程的名字和時間
l 修改存儲過程的功能代碼
Alter proc 過程名
@參數 參數類型 ~~~~
As
Begin 命令行 end
l 重命名存儲過程
Execute sp_rename 原名, 新名
l 刪除存儲過程
Drop proc 過程名1,過程名2~~ 同時可以刪除多個過程
帶有判斷條件的刪除存儲過程(與if exists語句結合)
l 存儲過程的自動執行和監控
l Oracle 和DB2數據庫中存儲過程的區別
四 觸發器(trigger)
l 觸發器與存儲過程的區別
1.存儲過程是獨立於表存在的,觸發器需要依附某個表的某個操作。
2.存儲過程需要使用名稱去調用才能執行,觸發器則在表的操作過程中自動被觸發調用。
l 觸發器的分類和作用
定義; 觸發器是一種特殊類型的存儲過程,通過事件的觸發來被執行,例如update delete drop alter drop等。 在sql 中有兩種方法可以保持數據的完整性和有效性:約束和觸發器,約束直接設置在表內只能執行一些比較簡單的功能,而觸發器可以執行比較復雜的過程。
作用: 1 可以調用存儲過程 2強化數據條件約束 3跟蹤數據庫內數據的變化並判斷數據變化是否符合數據庫的要求 4級聯和並行運行。
分類:DML 觸發器 DDL觸發器
DML觸發器:data manipulation language 又可以分為 事后觸發器(after觸發器)替代觸發器 (instead of)
After 觸發器 先執行變得增刪改操作后在觸發觸發器 。
Instead of 觸發器 不執行表的增刪改操作,它的這些操作只起到觸發觸發器的功能。
DDl 觸發器用來執行數據庫的管理任務。
注釋:
觸發器中兩個臨時表:inserted,deleted
這兩個表是臨時表,觸發器執行完成后,會自動消失,再次觸發會再次創建。
這兩個表的結構與on后面的那表的結構是一樣的(列名、列數、類型)。而且里面只有一條記錄。
插入操作--把新增的數據放到inserted表中。
刪除操作--把刪除的數據放到deleted表中。
修改操作--把舊數據放到deleted表中,把新數據放到inserted表中。
對兩個臨時表的使用。
從兩個臨時表中把數據取出來放到變量中,以備后面的使用。
l 創建執行事后觸發器
After 觸發器注意事項:觸發器名在同一數據庫中是唯一的;可以利用with encryption 對觸發器進行加密; 只能定義在數據表中不能定義在視圖上;after觸發器的動作只能是update delete insert 三種 其中的一種或者多種。
創建語法:
Create trigger 觸發器名 on 表名 for insert[update delete]
As
Begin
命令
End
實例:運行觸發器當數據表進行增刪改時自動發送郵件
Create trigger 觸發器名 on表名 for insert[update ,delete]
As begin
Execute xp_sendmail ‘郵箱地址’
end
l 創建與執行替代觸發器
注意點:instead of觸發器主要作用是使不可修改的視圖能夠支持修改。當然也可以對表進行操作。
構建語法: Create trigger 觸發器名 on 表名或者視圖名 instead of insert[delete update]
As
Begin
命令塊
End
Go
l 查看觸發器的屬性以及功能代碼信息
l 修改觸發器的功能代碼
l 重命名和刪除觸發器
Sp_rename 原名,新名 --重命名觸發器
Drop trigger 觸發器名【123】--可以同時刪除多個觸發器
l 禁用和啟用觸發器
Alter table 表名 disable trigger 觸發器名 禁用觸發器
Alter table 表名 enable trigger 觸發器名 啟用觸發器
Alter table 表名 enable trigger 觸發器名1,觸發器名2 啟用多個觸發器觸發器
Alter table 表名 enable trigger all 啟用 這個表中的所有觸發器
l 創建與執行ddl 觸發器
DDL 觸發器一般用於數據庫的管理工作, 其觸發事件為 create alter drop 開頭的語句
創建DDl 觸發器語法結構:
Create trigger 觸發器名 on 服務器或者是數據庫
For或者after create[drop alter ]
As begin
命令塊
End
注意點: DDl 觸發器沒有替代觸發器只有事后觸發器,不同是作用於數據庫還是服務器
l 修改和刪除ddl 觸發器
l 觸發器的使用
五事務(begin trans rollback返回 commit確定)