變數的定義
SQL Server中的變數就是一個參數,可以對這個參數進行賦值。
變數的分類
變數分為局部變數和全局變數,局部變數用@來標識,全局變數用@@來標識(常用的全局變數一般都是已經定義好的)
聲明變數
變數在使用前必須先聲明纔能夠使用。
申明局部變數語法
DECLARE @變數名 數據類型;
例如:
DECLARE @A INT;
這樣就聲明瞭一個整數型的變數@A
局部變數賦值
聲明完了變數就可以給變數賦值了,變數賦值有兩種方式SET 或 SELECT
語法
SET 變數名=值SELECT 變數名1=值1,變數名2=值2
SET 變數名=值
從上面的語法大家可能已經看出兩種賦值方式的區別了,SET只能給一個變數賦值,SELECT 可以給多個變數賦值。
例如
SET @A=3
SELECT @A=欄位名1,@B=欄位名2 FROM TABLE
變數常用場景
變數一般用作參數去給欄位賦值,即將變數的值反過來賦值給欄位。
我們以表Customers作為示例表
DECLARE @ID INT DECLARE @NAME VARCHAR2(50) DECLARE @ADDRESS VARCHAR2(50) --用SET方法給變數賦值 , 此方法一次只能給一個變數賦值 SET @ID=1 --將部門ID為1的客戶姓名和地址,賦值給@NAME和@ADDRESS變數 ,此方法能一次多個變數賦值 SELECT @NAME=姓名,@ADDRESS=地址 FROM Customers WHERE 客戶ID=@ID --查詢變數裏的結果 SELECT @NAME,@ADDRESS
結果如下:
如果我們想查詢其他ID的姓名和地址,只需要更改一下@ID的值即可。
Q:可能有人會問,我直接把值寫在客戶ID後面不就可以了嗎?為什麼寫這麼長一段內容來要使用變數呢?
這裡有兩個原因
1、使用簡便
當一個查詢裏同一個欄位需要修改的地方較多的時候,我們只需要修改這個欄位對應的變數內容,那麼所有的欄位對應的值都會一起跟著修改。
要查詢學生們對應的不同老師的信息:
DECLARE @ID INT SET @ID=1 SELECT * FROM TEST WHERE Teacher=@IDANDStudent=張三 UNION ALL SELECT * FROM TEST WHERE Teacher=@IDANDStudent=李四 UNION ALL SELECT * FROM TEST WHERE Teacher=@IDANDStudent=王五 UNION ALL SELECT * FROM TEST WHERE Teacher=@IDANDStudent=馬六 UNION ALL SELECT * FROM TEST WHERE Teacher=@IDANDStudent=趙七
我們只需要修改@ID的值,下面的所有查詢的ID都會變更。
2、可以提高查詢效率。
當我們使用查詢的使用,資料庫在執行這個查詢語句的時候,如果不使用變數來修改值,實際上是兩個查詢。
SELECT * FROM TEST WHERE Student=張三 SELECT * FROM TEST WHERE Student=李四
執行這兩個查詢,資料庫會制定兩個執行計劃,而制定執行計劃是需要消耗系統資源的。
而如果我們改成:
DECLARE @NAME VARCHAR(20) SET @NAME=張三 SELECT * FROM TEST WHERE Student=@NAME
當我們修改@NAME的值為李四的時候,資料庫還是會使用之前的執行計劃。這樣就節省了時間。
全局變數
全局變數使用@@來表示,一般都是系統預定義的一些全局變數。常用的全局變數有
@@ERROR ——最後一個SQL錯誤的錯誤號
@@IDENTITY —–最後一次插入的標識值
@@LANGUAGE —–當前使用的語言的名稱
@@MAX_CONNECTIONS – 可以創建的同時連接的最大數目
@@ROWCOUNT —-受上一個SQL語句影響的行數
@@SERVERNAME —-本地伺服器的名稱
@@TRANSCOUNT —–當前連接打開的事物數
@@VERSION —–SQL Server的版本信息
例如查詢資料庫的版本號
PRINT @@VERSION
結果:
查詢本地伺服器的名稱
PRINT @@SERVERNAME
這些信息都存儲在全局變數中,當發生改變時,全局變數的值也會跟著改變。
以上就是變數的一些相關內容,如有什麼疑問,可以在底下留言,我會一一回復的。
批註
變數的應用範圍比較廣,特別是在存儲過程,遊標還有動態SQL中都有應用。作用也比較明顯,在查詢優化方面也是一個不錯的選擇。此外還有很多全局變數可以供我們在平時的開發中去使用,有興趣的可以去探究一下其他全局變數的用法。
歡迎關注我的公眾號:SQL資料庫開發
推薦閱讀: