解决复杂问题不可能通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程或存储函数中SQL语句的执行顺序,是我们完成复杂操作必不可少的一部分。
流程控制语句是指可以控制程序运行顺序的语句,程序运行顺序主要包括顺序结构、分支结构和循环结构。MySQL中流程控制语句有IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句等。
01、判断语句
判断语句用来进行条件判断,根据是否满足条件(可包含多个条件),来执行不同的语句。判断语句构成分支结构。MySQL中常用的判断语句有IF和CASE两种。
1. IF语句
IF语句用来进行条件判断,可根据不同条件执行不同的操作。该语句在执行时首先判断IF语句后的条件是否为真,为真则执行THEN后的内容,如果为假则继续判断下一个IF语句直到条件为真为止,当以上条件都不满足时则执行ELSE子句后的内容。IF语句的基本语法格式如下所示。
语法说明如下。
-
search_condition是条件表达式。
-
statement_list是当前面的条件表达式为真时执行的SQL语句列表。
-
ELSEIF子句是可选选项,当前面的条件表达式为假时,用于设定继续判断的下一个IF语句。
-
ELSE子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。
【例8-30】在图书销售数据库booksale中建立存储过程getpricelevel1,该存储过程可通过图书编号bookid查看图书价格,返回价格和等级,其中价格高于或等于100元为A级,低于100元且高于或等于70元为B级,低于70元且高于或等于50元为C级,低于50元且高于或等于30元为D级,其余为E级,然后调用存储过程查看结果。
执行结果如图8-13所示。
■ 图8-13IF语句
2. CASE语句
CASE语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比IF语句更复杂的条件判断。CASE语句的基本语法格式如下所示。
语法说明如下。
-
case_value是表示条件判断的变量,决定了哪一个WHEN子句会被执行。
-
when_value是表示变量的取值,如果某个when_value的值与case_value变量的值相同,则执行对应的THEN关键字后的statement_list中的语句。
-
ELSE子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。其后的statement_list表示当when_value的值都不与case_value的值相同时的执行语句。
语法说明如下。
-
search_condition参数表示条件判断语句。
-
statement_list参数表示不同条件的执行语句。
-
ELSE子句是可选选项,用于设定当前面所有条件都不满足时执行的子句。
提示
语法2与语法1不同的是,语法2语句中的WHEN语句将被逐个执行,直到某个search_condition表达式为真,则执行对应THEN关键字后面的statement_list语句。如果没有条件匹配,ELSE子句里的语句被执行。CASE不能用于判断NULL。
【例8-31】用CASE语句改写例8-30,建立存储过程getpricelevel2,然后调用存储过程查看结果。
02、循环语句
循环语句是在符合指定条件的情况下,重复执行某一段代码。循环语句是构成循环结构的一部分。MySQL中常用的循环语句有LOOP、REPEAT和WHILE三种。
1. LOOP语句
LOOP语句用来实现简单的循环,使系统能够重复执行循环体内的语句列表。与IF和CASE语句相比,LOOP只是实现了一个简单的循环,并不进行条件判断。LOOP语句的基本语法格式如下所示。
语法说明如下。
-
begin_label和end_label是可选选项,分别是循环开始和结束的标志,该标志必须符合标识符命名规则,且最长为16个字符。如果设置了begin_label,则后面必须带着冒号(:),end_label可以省略。但如果设置了end_label,那必须设置begin_label,且标志名必须相同。
-
statement_list表示循环执行的语句。
提示
LOOP语句本身没有停止循环的语句,必须使用跳转语句LEAVE才能停止循环,跳出循环过程,否则会出现死循环。
【例8-32】在图书销售数据库booksale中建立存储过程sumnumber1,该存储过程可实现1到任意数的累加,然后调用存储过程查看结果。
执行结果如图8-14所示。
■ 图8-141到任意数的累加
声明局部变量i并赋初始值为1,声明局部变量sum并赋初始值为0,然后在LOOP语句中判断i的值是否大于输入的数值,如果是则输出num的值和sum的值,然后退出循环;如果不是则将i的值累加到sum变量中,并对i进行加1,再次执行LOOP中的语句。
2. REPEAT语句
REPEAT语句可以实现有条件控制的循环,每次语句执行完毕,会对条件表达式进行判断,如果表达式返回值为真,则循环结束,否则重复执行循环中的语句。REPEAT语句的基本语法格式如下所示。
语法说明如下。
-
begin_label、end_label和statement_list同LOOP语句的同名参数保持一致。
-
search_condition是结束循环的条件,满足该条件即条件的返回值为TRUE时循环结束。
【例8-33】用REPEAT改写例8-32,建立存储过程sumnumber2,然后调用存储过程查看结果。
3. WHILE语句
WHILE语句同样可以实现有条件控制的循环。WHILE语句和REPEAT语句不同的是,WHILE语句是当满足条件时,才执行循环内的语句,否则退出循环。WHILE语句的基本语法格式如下所示。
语法说明:所有参数同REPEAT语句的同名参数保持一致。
【例8-34】用WHILE改写例8-32,建立存储过程sumnumber3,然后调用存储过程查看结果。
03、跳转语句
跳转语句用于实现程序执行过程中的流程跳转。MySQL中常用的跳转语句有LEAVE和ITERATE两种。跳转语句也是构成循环结构的一部分。
跳转语句的基本语法格式如下所示。
语法说明:label表示循环的标志。
提示
LEAVE语句和ITERATE语句都用来跳出循环语句,但两者的功能是不一样的。TERATE语句用于结束本次循环的执行,开始下一轮循环的执行操作,重新开始循环;而LEAVE语句用于跳出整个循环,然后执行循环后面的程序。使用这两个语句时一定要区分清楚。
ITERATE语句只能应用在循环结构LOOP、REPEAT和WHILE语句中,LEAVE除可以在循环结构中应用外,还可在BEGIN…END中使用。
【例8-35】对比LEAVE和ITERATE的使用,然后调用存储过程查看结果。
执行结果如图8-15所示。
■ 图8-15LOOP语句
声明局部变量num并赋初始值为0,在LOOP循环中,当num小于5时,利用ITERATE不执行以下操作,重新开始LOOP循环,直到num大于5时,查看num的具体值,并利用LEAVE跳出LOOP循环。