流程控制语句

目录

前言

一、SET 语句

二、BEGIN ··· END 语句

三、IF ··· ELSE 语句

四、CASE 语句

五、WHILE 语句

六、GOTO 语句

七、RETURN 语句


前言

        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

欢迎大家一起讨论,若有不足之处还请斧正。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值