SQL?server數(shù)據(jù)庫declare和set用法技巧小結(jié)
最近遇到一段不怎么看得懂的SQL語句,經(jīng)過查閱資料,整理出來的有關(guān)數(shù)據(jù)拼接、數(shù)據(jù)庫變量的一些內(nèi)容如下:
如根據(jù)下述學(xué)生表,若要求得到年齡最大的學(xué)生信息:
學(xué)號 | 15001 | 15002 | 15003 | 16004 |
姓名 | 張三 | 李四 | 王麗 | 薇姿 |
性別 | 男 | 男 | 女 | 女 |
年齡 | 20 | 20 | 19 | 22 |
不使用變量的情況下,可用嵌套查詢實現(xiàn):
Select * from 學(xué)生表 where 年齡=(select max(年齡) from 學(xué)生表)
運用變量解決上述問題:
????????Declare @bianliang?int; ????????Set @bianliang=(select max(年齡) from 學(xué)生表); ????????Select * from 學(xué)生表 where 年齡=@bianliang
面對實際工作中海量紛繁復(fù)雜的數(shù)據(jù),使用嵌套或連接查詢時很容易出現(xiàn)各種語句錯誤,此時可以通過引入變量的方式將數(shù)據(jù)之間的邏輯關(guān)系簡單化、清晰化。
SQL Server中變量的使用主要涉及三方面的內(nèi)容,即定義變量,為變量賦值以及結(jié)果的顯示。
一、定義/聲明變量
變量分為全局變量和局部變量,全局變量一般是系統(tǒng)內(nèi)置的,用戶使用時一般無法自行定義,實際工作中也只需要使用局部變量。定義變量的語句如下(定義多個變量時需用逗號隔開):
Declare @變量名1 數(shù)值類型,@變量名2 數(shù)值類型,@變量名3 數(shù)值類型,……
如:declare @i1 int,@i2 nvarchar(10),@i3 money,……
二、為變量賦值
可以使用set或select命令為變量賦值,可以直接將某個具體的值賦給變量,也可以將一個需要經(jīng)過運算產(chǎn)生的查詢結(jié)果賦給變量。
1.直接賦值
如聲明變量:declare @bl1 int,@bl2 nvarchar(10),@bl3 money;
分別使用set和select分別為上述3個變量賦值:
set @bl1=100; set @bl2='hello' ; set @bl3=3.1415926 ;
或
Select @bl1=100, @bl2='hello',@bl3=3.1415926 ;
2.為變量賦一個需要運算產(chǎn)生結(jié)果的值
如聲明變量:Declare @bl int;
以前文的學(xué)生表為例,分別使用set和select將學(xué)生表中學(xué)生年齡的最大值賦給變量@bl:
Set @bl=(select max(年齡) from學(xué)生表);
或
Select @bl=max(年齡) from 學(xué)生表;
3.set與select為變量賦值時的區(qū)別
直接賦值時set與select并無區(qū)別,只有所賦的值是一個查詢結(jié)果時二者才有不同,當(dāng)查詢結(jié)果唯一時(如最大最小值),set和select都可以完成賦值,但是查詢結(jié)果不止一個時使用set會提示錯誤。
如查詢前文學(xué)生表中學(xué)生年齡:
Declare @bl?int; Set @bl=(select 年齡 from 學(xué)生表);
則變量@bl的賦值無法完成,因為學(xué)生表中年齡不止一條記錄。而此時select命令仍可以產(chǎn)生結(jié)果。
Declare @bl?int; Select @bl=年齡 from 學(xué)生表;
此時變量@i的值為22,即表中最后一行年齡數(shù)據(jù)。這是因為select對變量的賦值方式是遍歷數(shù)據(jù)中的全部記錄,然后將最后一條記錄賦給變量。
4.使用select命令為變量賦值的應(yīng)用
了解了select為變量賦值時遍歷全部數(shù)據(jù)的特性,用戶可以運用變量將表中的一列記錄變成一行值顯示,仍以前文提到的學(xué)生表為例:
Declare @i varchar(100) Set @i='' Select @i=@i+姓名 from學(xué)生表
此時變量@i的值為“張三李四王麗薇姿”。
這種方法在實際工作中可以結(jié)合存儲過程運用,提高SQL語句執(zhí)行效率。需要注意的是,若上例的學(xué)生表中“姓名”列有null值,則變量@i的值也是null,這是因為null與任何值進行運算結(jié)果都是null,此時需要通過isnull函數(shù)對null值進行調(diào)整。
三、顯示結(jié)果
變量的結(jié)果有兩種顯示方式,即文本顯示(print)和表格顯示(select)兩種.
總結(jié)
相關(guān)文章
SQL建立數(shù)據(jù)庫及刪除數(shù)據(jù)庫命令
SQL建立數(shù)據(jù)庫及刪除數(shù)據(jù)庫命令,需要使用sqlserver的朋友可以參考下。2011-11-11sqlserver數(shù)據(jù)庫移動數(shù)據(jù)庫路徑的腳本示例
前段時間做過這么一件事情,把原本放在c盤的所有數(shù)據(jù)庫(除了sql server系統(tǒng)文件外)文件Move到D盤,主要是為了方便后續(xù)管理以及減少磁盤I/O阻塞(C,D是2個獨立磁盤)。腳本需輸入2個參數(shù):目標(biāo)數(shù)據(jù)庫名字和目標(biāo)目錄2013-12-12刪除sqlserver數(shù)據(jù)庫日志和沒有日志的數(shù)據(jù)庫恢復(fù)辦法
這篇文章主要介紹了刪除sqlserver數(shù)據(jù)庫日志和沒有日志的數(shù)據(jù)庫恢復(fù)辦法,需要的朋友可以參考下2014-06-06數(shù)據(jù)庫性能優(yōu)化一:數(shù)據(jù)庫自身優(yōu)化提升性能
數(shù)據(jù)庫自身優(yōu)化包括:增加次數(shù)據(jù)文件,設(shè)置文件自動增長、表分區(qū),索引分區(qū)、分布式數(shù)據(jù)庫設(shè)計、整理數(shù)據(jù)庫碎片等等.需要了解的朋友可以參考下2013-01-01[圖文]三分鐘學(xué)會Sql Server的復(fù)制功能
有兩個服務(wù)器,裝了兩個數(shù)據(jù)庫,一個是主的,一個是備用的,下面的的功能就將主數(shù)據(jù)庫的數(shù)據(jù)庫,實時同步到備用數(shù)據(jù)庫上,使他們的數(shù)據(jù)內(nèi)容,基本上保持一致。2008-07-07