流程控制
- 顺序结构: 程序从上往下依次执行
- 分支结构: 程序按条件进行选择执行,从两条或多条路径中选择一条执行。
- 循环结构: 程序满足一定条件下,重复执行一组语句
针对于MySQL的流程控制语句主要有3类。注意:只能用于存储程序
条件判断语句 :if 语句 和 case 语句
循环语句:LOOP、while、REPEAT
分支结构 if elseif end if
if 语句语法结构
if 表达式1 then
操作1
[elseif 表达式2 then 操作2].。。。
[else 操作n]
end if ; --这个 ; 别忘记了
案例
delimiter $
create procedure pro_x(in id)
begindeclare dep_id , emp_id int ;declare work_age int default 1;select depid , workage , empid into dep_id , workage , empid from empwhere emp_id=id ;# if 分支if work_age >=20 and dep_id =1002 then# 操作语句;elseif if dep_id =1004 then# 操作语句;else # else 后面没有 then# 操作语句;end if ; # end if ; 别忘记
end $delimiter ;### 调用 存储过程
set @id=10;
call pro_x(@id);
分支结构 case when then
跟在 select 中 case when then 一样的
**syntax **
## 情况1 : 类似 switch case
case 表达式
when 值1 then 操作
when 值2 then 操作
。。。。
else 结构n 或语句n(如果是语句,需要加 分号 )end [case] (如果是放在begin end 中需要加上 case,如果放在select 后面不需要)### 情况2 类似 if
case
when 表达式1 then 操作
when 表达式 2 then 操作
。。。。
else 结果 n 或语句你如果是语句,需要加 分号 )end [case] (如果是放在begin end 中需要加上 case,如果放在select 后面不需要)
循环结构 之 LOOP
[ loop_label : ] LOOP循环执行的语句
end loop [ loop_label]
# 其中,Loop_label 表示Lopp语句的标注名称,该参数可以省略
案例
delimiter $
create procedure pro_loop(out cnt int )
begindeclare id int default 0;add_loop : LOOPset id =id +1;if cnt>=10 thenLEAVE add_loop;end if;END LOOP add_loop;set cnt=id;
end $delimiter ;
#### 调用
call pro_loop( @num)
while
while 语句创建一个带条件判断的循环过程。 while 在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环, 相当于 其余语言的 while 循环结构
[while_lable:] while 循环条件 DO循环体
END while [while_lable]; #### ; 别忘记
while_lable 为While语句的标注名称;如果循环条件结果为真,while语句内的语句或语句群被重复,直到循环条件为假,退出循环。
delimiter $
create procedure pro_while()
begindeclare num int default 0;while num>=100 doset num=num+1;end while ; ### 分号别忘记select num;
end $delimiter ;# 调用
call pro_while();
repeat
repeat 语句创建一个带条件判断的循环过程。与while循环结构不同,repeat循环首先会执行依次循环体,然后再until 中进行表达式的判断。如果满足条件就退出,即 end repeat; 如果条件不满足,则会就继续执行循环,直到满足退出条件为止。
[ repeat_labler : ] repeat循环体语句
until 结束循环的条件表达式 ## 此次没有 分号
end repeat [ rpeat_label ] ;
repeat_label 为repeat 语句的标注名称, 该参数可以省略; repeat语句内的语句或语句群被重复,直到 until 后面的表达式为真。
delimiter $
create procedure pro_repeat()
begindeclare num,cnt int default 0; # declare 同时定义多个变量,但必须同一类型。repeatset num=num+1,cnt= cnt+1; # set 多个变量赋值, 中间用 逗号 隔开until num>500 # 没有分号 end repeat ;select num,cnt;
end $delimiter ;# 调用
call pro_repeat();
三种循环结构 的区别 repeat 、 while 、 loop
repeat 相当于 do。。。。while
while 相当于 while
这三种循环都可以省略 标注名称,但如果循环中加了 循环控制语句 (leave 、Iterate )则必须添加 标注名称
LOOP:一般用于实现简单的循环(若以结束循环,需要借助 IF 和 leave,一定用到 leave,就必须使用 标注名称(标签名称))
WHILE: 先判断后执行
REPEAT:先执行后判断,循环体至少执行一次
循环结构,一定具备四要素
- 初始化条件
- 循环条件
- 循环体
- 迭代条件 更新 循环条件中的值
跳转语句 iterate 、 leave
leave语句:可以用在**循环(loop、while、repeat)**语句中,或者 以 begin…end 包裹起来的 程序体内,表示跳出 循环体或者 跳出程序体的操作。 相当于 beak
leave 标记名
iterate语句:只能在循环语句(loop、while、repeat)内,表示结束本次循环,跳转下次循环。 相当于 continue, 再次循环。
iterate label;
laberl:循环的标注名称。