SQL中的變量
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
變量的定義
SQL Server中的變量就是一個(gè)參數(shù),可以對(duì)這個(gè)參數(shù)進(jìn)行賦值。
變量的分類
變量分為局部變量和全局變量,局部變量用@來標(biāo)識(shí),全局變量用@@來標(biāo)識(shí)(常用的全局變量一般都是已經(jīng)定義好的)
聲明變量
變量在使用前必須先聲明才能夠使用。
申明局部變量語法
DECLARE @變量名 數(shù)據(jù)類型;
例如:
DECLARE @A INT;
這樣就聲明了一個(gè)整數(shù)型的變量@A
局部變量賦值
聲明完了變量就可以給變量賦值了,變量賦值有兩種方式SET 或 SELECT
語法
SET 變量名=值
SELECT 變量名1=值1,變量名2=值2
從上面的語法大家可能已經(jīng)看出兩種賦值方式的區(qū)別了,SET只能給一個(gè)變量賦值,SELECT 可以給多個(gè)變量賦值。
例如
SET @A=3
SELECT @A=字段名1,@B=字段名2 FROM TABLE變量常用場景
變量一般用作參數(shù)去給字段賦值,即將變量的值反過來賦值給字段。
我們以表Customers作為示例表

DECLARE @ID INT
DECLARE @NAME VARCHAR2(50)
DECLARE @ADDRESS VARCHAR2(50)
--用SET方法給變量賦值 , 此方法一次只能給一個(gè)變量賦值
SET @ID=1
--將部門ID為1的客戶姓名和地址,賦值給@NAME和@ADDRESS變量 ,此方法能一次多個(gè)變量賦值
SELECT @NAME=姓名,@ADDRESS=地址 FROM Customers WHERE 客戶ID=@ID
--查詢變量里的結(jié)果
SELECT @NAME,@ADDRESS結(jié)果如下:

如果我們想查詢其他ID的姓名和地址,只需要更改一下@ID的值即可。
Q:可能有人會(huì)問,我直接把值寫在客戶ID后面不就可以了嗎?為什么寫這么長一段內(nèi)容來要使用變量呢?
這里有兩個(gè)原因
1、使用簡便
當(dāng)一個(gè)查詢里同一個(gè)字段需要修改的地方較多的時(shí)候,我們只需要修改這個(gè)字段對(duì)應(yīng)的變量內(nèi)容,那么所有的字段對(duì)應(yīng)的值都會(huì)一起跟著修改。
例如
要查詢學(xué)生們對(duì)應(yīng)的不同老師的信息:
DECLARE @ID INT
SET @ID=1
SELECT * FROM TEST WHERE Teacher=@ID AND Student='張三'
UNION ALL
SELECT * FROM TEST WHERE Teacher=@ID AND Student='李四'
UNION ALL
SELECT * FROM TEST WHERE Teacher=@ID AND Student='王五'
UNION ALL
SELECT * FROM TEST WHERE Teacher=@ID AND Student='馬六'
UNION ALL
SELECT * FROM TEST WHERE Teacher=@ID AND Student='趙七'我們只需要修改@ID的值,下面的所有查詢的ID都會(huì)變更。
2、可以提高查詢效率。
當(dāng)我們使用查詢的使用,數(shù)據(jù)庫在執(zhí)行這個(gè)查詢語句的時(shí)候,如果不使用變量來修改值,實(shí)際上是兩個(gè)查詢。
例如:
SELECT * FROM TEST WHERE Student='張三'
SELECT * FROM TEST WHERE Student='李四'執(zhí)行這兩個(gè)查詢,數(shù)據(jù)庫會(huì)制定兩個(gè)執(zhí)行計(jì)劃,而制定執(zhí)行計(jì)劃是需要消耗系統(tǒng)資源的。
而如果我們改成:
DECLARE @NAME VARCHAR(20)
SET @NAME='張三'
SELECT * FROM TEST WHERE Student=@NAME當(dāng)我們修改@NAME的值為'李四'的時(shí)候,數(shù)據(jù)庫還是會(huì)使用之前的執(zhí)行計(jì)劃。這樣就節(jié)省了時(shí)間。
全局變量
全局變量使用@@來表示,一般都是系統(tǒng)預(yù)定義的一些全局變量。常用的全局變量有
@@ERROR ——最后一個(gè)SQL錯(cuò)誤的錯(cuò)誤號(hào)
@@IDENTITY —–最后一次插入的標(biāo)識(shí)值
@@LANGUAGE —–當(dāng)前使用的語言的名稱
@@MAX_CONNECTIONS – 可以創(chuàng)建的同時(shí)連接的最大數(shù)目
@@ROWCOUNT —-受上一個(gè)SQL語句影響的行數(shù)
@@SERVERNAME —-本地服務(wù)器的名稱
@@TRANSCOUNT —–當(dāng)前連接打開的事物數(shù)
@@VERSION —–SQL Server的版本信息
例如查詢數(shù)據(jù)庫的版本號(hào)
PRINT @@VERSION結(jié)果:

查詢本地服務(wù)器的名稱
PRINT @@SERVERNAME結(jié)果:

這些信息都存儲(chǔ)在全局變量中,當(dāng)發(fā)生改變時(shí),全局變量的值也會(huì)跟著改變。
以上就是變量的一些相關(guān)內(nèi)容,如有什么疑問,可以在底下留言,我會(huì)一一回復(fù)的。
總結(jié)
變量的應(yīng)用范圍比較廣,特別是在存儲(chǔ)過程,游標(biāo)還有動(dòng)態(tài)SQL中都有應(yīng)用。作用也比較明顯,在查詢優(yōu)化方面也是一個(gè)不錯(cuò)的選擇。此外還有很多全局變量可以供我們?cè)谄綍r(shí)的開發(fā)中去使用,有興趣的可以去探究一下其他全局變量的用法。

后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
知乎:國家何時(shí)整治程序員的高薪現(xiàn)象? SQL觸發(fā)器實(shí)戰(zhàn) 一款SQL自動(dòng)檢查神器,再也不用擔(dān)心SQL出錯(cuò)了! SQL如何求解連續(xù)年份的問題? SQL 語法速成手冊(cè)
