最近遇到一段不怎么看得懂的SQL语句,经过查阅资料,整理出来的有关数据拼接、数据库变量的一些内容如下:

如根据下述学生表,若要求得到年龄最大的学生信息:

学号15001150021500316004
姓名张三李四王丽薇姿
性别
年龄20201922

不使用变量的情况下,可用嵌套查询实现:

Select * from 学生表 where 年龄=(select max(年龄) from 学生表)

运用变量解决上述问题:

Declare @bianliangint;

Set @bianliang=(select max(年龄) from 学生表);

Select * from 学生表 where 年龄=@bianliang

面对实际工作中海量纷繁复杂的数据,使用嵌套或连接查询时很容易出现各种语句错误,此时可以通过引入变量的方式将数据之间的逻辑关系简单化、清晰化。

SQL Server中变量的使用主要涉及三方面的内容,即定义变量,为变量赋值以及结果的显示。

一、定义/声明变量

变量分为全局变量和局部变量,全局变量一般是系统内置的,用户使用时一般无法自行定义,实际工作中也只需要使用局部变量。定义变量的语句如下(定义多个变量时需用逗号隔开):

Declare @变量名1 数值类型,@变量名2 数值类型,@变量名3 数值类型,……

如:declare @i1 int,@i2 nvarchar(10),@i3 money,……

二、为变量赋值

可以使用set或select命令为变量赋值,可以直接将某个具体的值赋给变量,也可以将一个需要经过运算产生的查询结果赋给变量。

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.为变量赋一个需要运算产生结果的值

如声明变量:Declare @bl int;

以前文的学生表为例,分别使用set和select将学生表中学生年龄的最大值赋给变量@bl:

Set @bl=(select max(年龄) from学生表);

Select @bl=max(年龄) from 学生表;

3.set与select为变量赋值时的区别

直接赋值时set与select并无区别,只有所赋的值是一个查询结果时二者才有不同,当查询结果唯一时(如最大最小值),set和select都可以完成赋值,但是查询结果不止一个时使用set会提示错误。

如查询前文学生表中学生年龄:

Declare @blint;

Set @bl=(select 年龄 from 学生表);

则变量@bl的赋值无法完成,因为学生表中年龄不止一条记录。而此时select命令仍可以产生结果。

Declare @blint;

Select @bl=年龄 from 学生表;

此时变量@i的值为22,即表中最后一行年龄数据。这是因为select对变量的赋值方式是遍历数据中的全部记录,然后将最后一条记录赋给变量。

4.使用select命令为变量赋值的应用

了解了select为变量赋值时遍历全部数据的特性,用户可以运用变量将表中的一列记录变成一行值显示,仍以前文提到的学生表为例:

Declare @i varchar(100)

Set @i=’’

Select @i=@i+姓名 from学生表

此时变量@i的值为“张三李四王丽薇姿”。

这种方法在实际工作中可以结合存储过程运用,提高SQL语句执行效率。需要注意的是,若上例的学生表中“姓名”列有null值,则变量@i的值也是null,这是因为null与任何值进行运算结果都是null,此时需要通过isnull函数对null值进行调整。

三、显示结果

变量的结果有两种显示方式,即文本显示(print)和表格显示(select)两种.