SQL 視圖 局部變量 全局變量 條件語句 事務 觸發器


一.視圖

 


1.視圖是一張虛擬表,他所存儲的不是實際數據,而是查詢語句,但我們可以對視圖進行像數據表一樣的操作。

2.為什么使用視圖呢?我的理解是:1.在遠程傳輸數據時,可以避免過長的查詢字符,減少流量。2.他可以簡化繁雜的多表嵌套查詢語句。3.安全性,防止非法用戶訪問敏感數據,因為我們可以通過創建視圖展示給用戶,我們想要給他們查看的數據。

3.視圖的創建

create view vw_city
as
select cityName from city   --這個查詢語句可以隨便的寫,如果是些多層次的嵌套查詢語句的話,那么下面使用視圖的簡易性就突出了。應為只用一句簡短的查詢語句就能把原本繁雜的搞定

 4.視圖的查詢

select * from vw_city

5.由於視圖是以查詢語句的形式存儲的,所以一般視圖只用於查看數據,一般不對視圖進行增刪改。如果數據庫中的表數據改變那么視圖中的數據也會隨之改變,因為視圖就相當於查詢語句。


二.局部變量(使用便於寫數據庫方法,及存儲過程等)

 


1.局部變量的聲明(一個@)

declare @n int   --聲明變量關鍵字為declare 然后@加變量名 后面是變量類型
declare @s varchar(36) 

2.局部變量的賦值

set @s='f4'
set @n=@n+1  --變量的賦值有兩種方法,一種是通過set,一種是select 如果變量不附初始值則默認為null,null參與計算的結果還是null,這一行的@n就等於null
select @n=age from students  --如過變量通過select賦值,這里可能在表中查到很多age結果,這里只賦值查詢出來的最后一個age結果,如果set使用這種方法會出錯。
set @n=(select age from Students where ID='1')--亦可以這樣給他賦值

三.全局變量


1.全局變量是系統自定義,維護的,我們不能修改全局變量的值。以@@開頭。

2.全局變量一覽

select APP_NAME ( ) as w --當前會話的應用程序

select @@ERROR    --返回最后執行的 Transact-SQL 語句的錯誤代碼(integer)(如果最后一條語句不出錯,就一直是0)

select @@IDENTITY   --返回最后插入的標識值

select USER_NAME()    --返回用戶數據庫用戶名

select @@CONNECTIONS  --返回自上次SQL啟動以來連接或試圖連接的次數。

select GETDATE() --當前時間

select @@CPU_BUSY/100  --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒

USE tempdb select @@DBTS  as w  --為當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。

select @@IDLE  as w  --返回SQL自上次啟動后閑置的時間,單位為毫秒

select @@IO_BUSY AS w   --返回SQL自上次啟動后用於執行輸入和輸出操作的時間,單位為毫秒

select @@LANGID AS w   --返回當前所使用語言的本地語言標識符(ID)

select @@LANGUAGE AS w   --返回當前使用的語言名

select @@LOCK_TIMEOUT as w  --當前會話的當前鎖超時設置,單位為毫秒。

select @@MAX_CONNECTIONS  as w  --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值

EXEC sp_configure  --顯示當前服務器的全局配置設置

select @@MAX_PRECISION as w --返回 decimal  numeric 數據類型所用的精度級別,即該服務器中當前設置的精度。默認最大精度38

select @@OPTIONS  as w  --返回當前 SET 選項的信息。

select @@PACK_RECEIVED as w  --返回SQL自啟動后從網絡上讀取的輸入數據包數目。

select @@PACK_SENT as w  --返回SQ自上次啟動后寫到網絡上的輸出數據包數目。

select @@PACKET_ERRORS as w  --返回自SQL啟動后,在SQL連接上發生的網絡數據包錯誤數。

select @@SERVERNAME as w --返回運行SQL服務器名稱。

select @@SERVICENAME  as w --返回SQL正在其下運行的注冊表鍵名

select @@TIMETICKS  as w --返回SQL服務器一刻度的微秒數

select @@TOTAL_ERRORS AS w  --返回 SQL服務器自啟動后,所遇到的磁盤讀/寫錯誤數。

select @@TOTAL_READ  as w  --返回 SQL服務器自啟動后讀取磁盤的次數。

select @@TOTAL_WRITE as w  --返回SQL服務器自啟動后寫入磁盤的次數。

select @@TRANCOUNT  as w  --返回當前連接的活動事務數。

select @@VERSION as w  --返回SQL服務器安裝的日期、版本和處理器類型。

 


四.條件語句


1.條件語句

if(條件表達式)
begin
語句...
end
else
begin
語句...
end

2.循環語句

while
begin
語句....
break/continue
end

五.事務(去不了終點,回到原點)


1.事務:如果你要一起執行多條語句,如果有一條失敗你就可以讓他們全部都撤銷執行。

begin tran  --開啟一個事物
delete from city  
select * from city ---這里查詢沒有數據,因為上一句刪除了
rollback tran  
select * from city  --這里在查詢,驚奇的發現,數據又恢復了,因為上一句rollback是 讓這個事務回滾的效果,


begin tran  --開啟一個事物
delete from city  
select * from city ---這里查詢沒有數據,因為上一句刪除了
commit tran  
select * from city  --這里在查詢,不好意思,數據真的沒了,即便下邊你在rollback數據也回不來了,因為commit執行了數據真的把數據刪掉了

2.事務小案例

---bank表為轉賬表,MeMoney字段為我的賬余額,HeMoney為朋友的賬戶余額,這個事務完成的是我給朋友轉賬
begin tran
declare @ersum int        --定義這個局部變量為了記載這個事務過程中是否會出錯,如果出錯則最終將得不到為0的值,也就完成了我們判斷這個事務是否出錯過
set @ersum=0 
update bank set MeMoney=MeMoney-1000 where ID=me   ---從我卡里扣掉1000
set @ersum=@ersum+@@ERROR           --如果不出錯這里還是0,如果錯了,這里將不是0
update bank set HeMoney=HeMoney+100 where ID=he    ---給我朋友卡里加上1000
set @ersum=@ersum+@@ERROR     --如果這里的結果是0將表明沒有出錯
if(@ersum<>0)  --true有錯,false沒錯
begin
rollback tran  ---回滾事務
end
else
begin
commit tran    --執行事務
end

六.觸發器


1.觸發器,當數據庫中的表有所改動(添刪改)是會觸發一中事件,這樣一種機制,就是觸發器。

2.觸發器種類:after跟for一樣,是語句執行完畢后觸發事件。instead of :本來你要執行一種操作,結果執行了另外一種操作,原本要執行的操作被替換。

3.觸發器的創建

create trigger 觸發器名 on 操作表(實際要操作的表)
for|after|instead of  --選其任意一種類型,其中for跟after是一樣的
update|delete|insert    --原本要執行哪一種動作
as
sql語句.....    ---你想要執行的sql語句

4.觸發器的小案例

--這個例子是,刪除Tb1里面的數據,把刪除的數據同時備份到Tb1Bak表中
create trigger tri_bak on Tb1  --聲明一個tri_bak ,如果Tb1表中的數據變化觸發這個觸發器
after delete   ---刪除完成后執行下面的操作
as
insert into Tb1Bak select * from deleted   ---這里的deleted是系統自動生成的表,存放為上一次的數據庫表中刪除的數據。

 

5.小知識點:數據更新插入刪除的過程為,插入數據庫表的同時,也插入了系統表的insert表,刪除的同時把刪除的這條數據插入到了deleted表中,跟新的同時,deleted表中插入就數據,insert表中也添加了新數據。  我這里的insert 、deleted表都為系統自動生成的,不是我們操作的表。


七.如果我哪里寫錯了,或者你想說點什么,歡迎留言。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM