最近遇到一段不怎么看得懂的SQL语句,经过查阅资料,整理出来的有关数据拼接、数据库变量的一些内容如下:
如根据下述学生表,若要求得到年龄最大的学生信息:
学号 | 15001 | 15002 | 15003 | 16004 |
姓名 | 张三 | 李四 | 王丽 | 薇姿 |
性别 | 男 | 男 | 女 | 女 |
年龄 | 20 | 20 | 19 | 22 |
不使用变量的情况下,可用嵌套查询实现:
Select * from 学生表 where 年龄=(select max(年龄) from 学生表)
运用变量解决上述问题:
Declare @bianliang int;
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 @bl int;
Set @bl=(select 年龄 from 学生表);
则变量@bl的赋值无法完成,因为学生表中年龄不止一条记录。而此时select命令仍可以产生结果。
Declare @bl int;
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)两种.