目录
前言
T-SQL 提供了用于编写过程性代码的语法结构,可用来进行顺序、分支、循环、存储过程等程序设计,编写结构化的模块代码,从而提高编程语言的处理能力。
控制语句 | 说明 | 控制语句 | 说明 |
SET | 赋值语句 | CONTINUE | 重新开始下一次循环 |
BEGIN ··· END | 定义语句块 | BREAK | 退出循环 |
IF ··· ELSE | 条件语句 | GOTO | 无条件转移语句 |
CASE | 分支语句 | RETURN | 无条件推出语句 |
WHILE | 循环语句 |
一、SET 语句
声明一个变量后,这个变量将被初始化为 NULL,使用 SET语句将给这个变量重新赋值。
-- 语法格式
SET @local_variable = expression
SET 语句是顺序执行的,将一个表达式赋值给声明的变量。表达式的数据类型必须与变量的类型相符合。
-- 示例:
declare @myvar char(20);
set @myvar = ' this is a test ';
select @myvar;
go
除了复制功能以外,SET 语句也实现一些设置功能,如设置日期类型的数据格式、设置数据库的某些属性等。
二、BEGIN ··· END 语句
BEGIN ··· END 语句能够将多个 T-SQL 语句组合成一个语句块,并将它们视为一个单元处理。
-- 语法格式
BEDIN
{
-- SQL 语句
}
END
三、IF ··· ELSE 语句
-- 语法格式
IF (条件表达式)
{
-- 条件表达式为真时,执行。
}
ELSE
{
-- 条件表达式为假时,执行。
}
-- 在条件表达式中,可存在 SELECT 语句。
-- 其中,条件表达式的值,必须为布尔值。如果条件表达式中存在 SELECT 语句时,必须用括号跨起来。
-- 示例:如果 C001号课程的平均成绩高于80分,则显示 ‘ 平均成绩还不错 ’ ,否则显示 ‘ 平均成绩一般 ’ 。
if (select avg(score) from sc where cno = 'C001') > 80
print ' 平均成绩还不错 '
else
print ' 平均成绩一般 '
-- 示例:输出 201502001 号学生的平均成绩,如果没有这个学生或该学生没有选课,则显示相应的提示信息。
if exists (select * from sc where sno = '201502001')
select avg(score) from sc where sno = '201502001'
else
if exists (select * from student where sno = '201502001')
print '该学生没有选课'
else
print '没有该学生'
四、CASE 语句
使用 CASE 语句可以进行多个分支的选择。
CASE 具有下面两种语法格式。
- 简单 CASE 格式:将某个表达式与一组简单表达式进行比较,以确定结果。
- 搜索 CASE 格式:计算一组布尔表达式,以确定结果。
-- 简单 CASE 语法格式
CASE input_expression
WHEN when_expression THEN result_expression
[ ... n ]
[ ELSE else_result_expression ]
END
-- 搜索 CASE 格式
CASE
WHEN Boolean_expression THEN result_expression
[ ... n ]
[ ELSE else_result_expression ]
END
-- input_expression:是使用简单 CASE 格式时所计算的表达式。
-- WHEN when_expression:使用简单 CASE格式时,input_expression 所比较的简单表达式。when_expression 是任意有效的表达式,when_expression 与 input_expression 的数据类型必须相同,或存在隐性转换。
-- THEN result_expression:当 input_expression = when_expression 的值为 TRUE 时,或者 Boolean_expression 取值为 TRUE时,返回的表达式。
-- ELSE else_result_expression:当比较运算取值不为 TRUE 时,返回的表达式。如果省略此参数,并且比较运算的值不为 TRUE 时,CASE 将返回 NULL 值。
-- WHEN Boolean_expression:使用 CASE 搜索格式时,所计算的布尔表达式。
-- 示例:以简单 case 格式查询所有学生的专业情况,包括学号,姓名和专业的英文名。
select sno, sname,
case specialty
when '计算机' then 'Computer'
when '电子信息' then 'Electronic Information'
when '通信工程' then 'Communication Engineering'
else 'Network Engineering'
end as specialty
from student
-- 以搜索 CASE 格式查询所有学生的考试等级,包括学号,课程号和成绩级别(a、b、c、d)。
select sno, cno,
case
when score>= 90 then 'a'
when score>= 80 then 'b'
when score>= 70 then 'c'
when score>= 60 then 'd'
end as 等级
from sc
五、WHILE 语句
WHILE 是一个循环语句,通过布尔值来设置一个条件,当这个条件成立时,重复执行循环体。可以使用 BREAK 和 CONTINUE 关键字在循环中控制 WHILE循环种语句的执行顺序。
-- 语法格式
WHILE ( 条件表达式 )
-- 循环体
BREAK 命令的功能是让程序跳出循环体,而 CONTINUE 命令是让程序跳出本次循环。通常情况下, BREAK 和 CONTINUE 是放在 IF ··· ELSE 语句种的,即在满足条件的情况下,判断是跳出循环还是进入下一次循环。
-- 示例:创建一个临时表 #TempOrder,包含 userid 和 username两个字段,使用 while 循环向这个表中添加10条数据,并查看表中的数据。
create table #TempOrder
(
userid int,
username nchar(10)
)
go
declare @i int;
set @i = 1;
while @i <= 10
begin
insert into #TempOrder(userid, username)
values
( @i, 'user' + ltrim(str(@i)) )
set @i += 1
end
go
select * from #TempOrder
go
drop table #TempOrder
-- 示例:求1 ~ 100 的累加和,包含 100。
declare @i int = 1, @sum int = 0
while @i <= 100
begin
set @sum += @i
set @i += 1
end
select @sum
六、GOTO 语句
GOTO 语句可以实现无条件的跳转。
-- 语法格式
GOTO lable /* lable为要跳转的到的语句标号 */
-- 标号是 GOTO 的目标,它仅标识了跳转的目标。标号不隔离其前后的语句,执行标号前面的用户将跳过标号并执行标号后面的语句。除法标号前面的语句本身是控制流语句(如RETURN)。
-- 示例:用 goto 实现循环:求 1 ~ 100 的和,包括100。
declare @i int = 1, @sum int = 0
my_loop:
set @sum += @i;
set @i += 1;
if @i < = 100 goto my_loop
print @sum
-- 输出 201602001号学生的平均成绩,若没有该学生或该学生没有选课,则显示相应的提示信息,用 goto 语句实现。
declare @avg float
if (select count(*) from sc where sno = '201602001') = 0 goto label
select @avg = avg(score) from sc where sno = '201602001'
print '201602001号学生的平均成绩为:' + cast(@avg as varchar)
return
label: print '没有该学生 或该学生没有选课'
一般来说,应尽量少用 GOTO 语句。过多使用 GOTO 语句可能会使 T-SQL 批处理的逻辑难以理解。使用 GOTO 实现的逻辑几乎都可以使用其它控制流语句实现。GOTO 最好用于跳出深层嵌套的控制流语句。
七、RETURN 语句
使用 RETURN 语句,可以从查询或过程种无条件退出。可在任何时候用于从过程、批处理、语句块种退出,而 RETURN之后的语句不会被执行。
-- 语法格式
RETURN [ integer_expression ] /* 整形表达式 */
-- 整形表达式为一个整数值,是 RETURN 语句要返回的值。
注:当用于存储过程时,不能返回空值。如果试图返回空值,将生成警告信息,并返回 0 值。
-- 示例:利用存储过程求某个学生的平均成绩。
create procedure mypro
@sno char(20)
as
return (select avg(score) from sc where sno = @sno)
-- 创建查询:查询 201602001号学生的姓名和平均成绩。
declare @avg float, @sno char(20)
set @sno = '201602001'
exec @avg = mypro @sno
select sname, @avg as '平均成绩' from student where sno = @sno
欢迎大家一起讨论,若有不足之处还请斧正。