购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.5 流程控制

流程控制语句是用来控制程序执行流程的语句。使用流程控制语句可以提高编程语言的处理能力。与程序设计语言(如C语言)一样,SQL提供的流程控制语句如下:

     BEGIN…END      IF            IF...ELSE
     CASE        WHILE     WHILE...CONTINUE... BREAK
     RETURN          GOTO       WAITFOR

5.5.1 BEGIN...END

BEGIN...END语句用于将多个SQL语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的SQL语句的语句块时,使用BEGIN...END语句。语法如下:

     BEGIN
     {sql_statement...}
     END

其中,sql_statement是指包含的SQL语句。

BEGIN和END语句必须成对使用,任何一条语句均不能单独使用。BEGIN语句后为SQL语句块,END语句指示语句块结束。

【例5.6】 在BEGIN…END语句块中完成两个变量的值交换。运行结果如图5.6所示。 (实例位置:资源包\TM\sl\5\6)

图5.6 交换两个变量的值

SQL语句如下:

     declare  @x int,  @y int,@t int
     set @x=1
     set @y=2
     begin
     set @t=@x
     set @x=@y
     set @y=@t
     end
     print @x
     print @y

此实例不用BEGIN...END语句结果也完全一样,但BEGIN...END和一些流程控制语句结合起来更有用。在BEGIN...END中可嵌套另外的BEGIN...END定义另一程序块。

5.5.2 IF

在SQL Server中为了控制程序的执行方向,也会像其他语言(如C语言)一样有顺序、选择和循环3种控制语句,其中,IF就属于选择判断结构。IF结构的语法如下:

IF<条件表达式>

{命令行|程序块}

其中,<条件表达式>可以是各种表达式的组合,但表达式的值必须是逻辑值TRUE或FALSE。其中命令行和程序块可以是符合逻辑的SQL任意语句,但含两条或两条以上语句的程序块必须加上BEGIN...END子句。

执行顺序是:遇到选择结构IF子句,先判断IF子句后的条件表达式,如果条件表达式的逻辑值是TRUE,就执行后面的命令行或程序块,然后再执行IF结构下一条语句;如果条件表达式的逻辑值是FALSE,就不执行后面的命令行或程序块,直接执行IF结构的下一条语句。

【例5.7】 判断数字“3”是否是正数。运行结果如图5.7所示。 (实例位置:资源包\TM\sl\5\7)

SQL语句如下:

     declare  @x int
     set @x=3
     if @x>0
     print '@x是正数'
     print'end'

【例5.8】 判断数字“8”的奇偶性。运行结果如图5.8所示。 (实例位置:资源包\TM\sl\5\8)

图5.7 判断数字“3”的正负

图5.8 判断数字“8”的奇偶性

SQL语句如下:

     declare  @x int
     set @x=8
     if @x % 2=0
     print '@x偶数'
     print'end'

5.5.3 IF…ELSE

IF选择结构可以带ELSE子句。IF...ELSE的语法如下:

     IF<条件表达式>
         {命令行1|程序块1}
     ELSE
         {命令行2|程序块2}

如果逻辑判断表达式返回的结果是TRUE,那么程序接下来会执行命令行1或程序块1;如果逻辑判断表达式返回的结果是FALSE,那么程序接下来会执行命令行2或程序块2。无论哪种情况,最后都要执行IF...ELSE语句的下一条语句。

【例5.9】 判断两个数“8”和“3”的大小。运行结果如图5.9所示。 (实例位置:资源包\TM\sl\5\9)

SQL语句如下:

     declare  @x int,@y int
     set @x=8
     set @y=3
     if @x>@y
     print '@x大于@y'
     else
     print'@x小于或等于@y'

IF...ELSE结构还可以嵌套解决一些复杂的判断。

【例5.10】 输入一个坐标值(8,−3),然后判断它在哪一个象限。运行结果如图5.10所示。 (实例位置:资源包\TM\sl\5\10)

图5.9 判断两个数的大小

图5.10 判断坐标位于的象限

SQL语句如下:

5.5.4 CASE

使用CASE语句可以很方便地实现多重选择的情况,比IF...THEN结构有更多的选择和判断的机会,从而避免编写多重的IF...THEN嵌套循环。

SQL支持CASE有以下两种语句格式。

简单CASE函数:

CASE搜索函数:

CASE函数的参数及其说明如表5.5所示。

表5.5 CASE函数的参数及其说明

下面介绍简单CASE函数和CASE搜索函数两种格式的执行顺序。

1.简单CASE函数

(1)计算input_expression,然后按指定顺序对每个WHEN子句的input_expression=when_expression进行计算。

(2)如果input_expression = when_expression为TRUE,则返回result_expression。

(3)如果没有取值为TRUE的input_expression = when_expression,则当指定ELSE子句时,SQL Server将返回else_result_expression;若没有指定ELSE子句,则返回NULL值。

2.CASE搜索函数

(1)按指定顺序为每个WHEN子句的Boolean_expression求值。

(2)返回第一个取值为TRUE的Boolean_expression的result_expression。

(3)如果没有取值为TRUE的Boolean_expression,则当指定ELSE子句时,SQL Server将返回else_result_expression;若没有指定ELSE子句,则返回NULL值。

【例5.11】 在tb_Grade表(见图5.11)中,查询每个同学的成绩。如果成绩大于或等于90,显示成绩优秀;如果成绩小于90大于或等于80,显示成绩良好;如果成绩小于80大于或等于70,显示成绩及格,否则将显示不及格。运行结果如图5.12所示 。(实例位置:资源包\TM\sl\5\11)

图5.11 tb_Grade表

图5.12 用CASE查询tb_Grade表

SQL语句如下:

5.5.5 WHILE

WHILE子句是SQL语句支持的循环结构。在条件为TRUE的情况下,WHILE子句可以循环地执行其后的一条SQL命令。如果想循环执行一组命令,则需要配合BEGIN…END子句使用。WHILE的语法如下:

     WHILE<条件表达式>
     BEGIN
         <命令行|程序块>
     END

遇到WHILE子句,先判断条件表达式的值。当条件表达式的值为TRUE时,执行循环体中的命令行或程序块,遇到END子句自动地再次判断条件表达式的值的真假,决定是否执行循环体中的语句。只有当条件表达式的值为FALSE时,才结束执行循环体的语句。

【例5.12】 求1~10的整数的和。运行结果如图5.13所示。 (实例位置:资源包\TM\sl\5\12)

图5.13 求1~10的整数的和

SQL语句如下:

     declare  @n int,@sum int
     set @n=1
     set @sum=0
     while @n<=10
     begin
     set @sum=@sum+@n
     set @n=@n+1
     end
     print @sum

5.5.6 WHILE…CONTINUE…BREAK

循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。语法如下:

     WHILE<条件表达式>
     BEGIN
         <命令行|程序块>
         [BREAK]
         [CONTINUE]
         [命令行|程序块]
     END

其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令。BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。

【例5.13】 求1~10偶数的和,并用CONTINUE控制语句输出。运行结果如图5.14所示。 (实例位置:资源包\TM\sl\5\13)

图5.14 求1~10偶数的和

SQL语句如下:

     declare @x int,@sum int
     set @x=1
     set @sum=0
     while @x<10
     begin
     set @x=@x+1
     if @x%2=0
     set @sum=@sum+@x
     else
     continue
     end
     print @sum

5.5.7 RETURN

RETURN语句用于从查询或过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出。位于RETURN之后的语句不会被执行。语法如下:

     RETURN[整数值]

在括号内可指定一个返回值。如果没有指定返回值,SQL Server根据程序执行的结果返回一个内定值。RETURN命令返回的内定值及其含义如表5.6所示。

表5.6 RETURN命令返回的内定值及其含义

【例5.14】 RETURN语句实现退出功能。运行结果如图5.15所示 。(实例位置:资源包\TM\sl\5\14)

图5.15 RETURN实现退出功能

SQL语句如下:

     DECLARE @X INT
     set @x=3
     if @x>0
     print'遇到return之前'
     return
     print'遇到return之后'

5.5.8 GOTO

GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行。语法如下:

     GOTO  标识符

标识符需要在其名称后加上一个冒号“:”。例如:

     "33: " "loving: "

【例5.15】 用GOTO语句实现跳转输出小于或等于3的值。运行结果如图5.16所示。 (实例位置:资源包\TM\sl\5\15)

SQL语句如下:

5.5.9 WAITFOR

WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。语法如下:

     WAITFOR DELAY<’时间’>|TIME<’时间’>

其中,“时间”必须为DATETIME类型的数据,如“11:15:27”,但不能包括日期。各关键字含义如下。

DELAY:用来设定等待的时间,最多可达24 h。

TIME:用来设定等待结束的时间点。

【例5.16】 等待3 s后显示“祝你节日快乐!”,运行结果如图5.17所示。 (实例位置:资源包\TM\ sl\5\16)

图5.16 GOTO实现跳转功能

图5.17 等待3 s后输出信息

SQL语句如下:

     WAITFOR DELAY'00:00:03'
     PRINT'祝你节日快乐!'

【例5.17】 15:00显示“《新三国演义》开始了”。 (实例位置:资源包\TM\sl\5\17)

SQL语句如下: DGblNlqjqL5V2wnhiTyyI4/j3crza10bk8bABHIXQSov3Xl0Sfksdewds9HY099W

     WAITFOR TIME'15:00:00'
     PRINT'《新三国演义》开始了!''
点击中间区域
呼出菜单
上一章
目录
下一章
×