MySql(二十七)流程控制结构

流程控制结构

流程控制结构的分类:

  1. 顺序结构:程序从上往下顺序执行
  2. 分支结构:程序从两条或多条路径中选择一条执行
  3. 循环结构:程序在满足一定条件的基础上,重复执行一段代码。

分支结构

1. if函数

功能:实现简单的分支

语法:

if(表达式1,表达式2,表达式3)

注:执行顺序:如果表达式1成立,则返回表达式2的值;否则返回表达式3的值

应用:可以放在任何地方使用

2. case函数

情况1:类似于java中的switch-case:一般用于实现等值判断

语法:

case 变量|字段|表达式

when 要判断的值 then 返回值1(或语句;)

when 要判断的值 then 返回值2(或语句;)

else 返回值n(或语句;)

end (case;)

情况2:类似于java中的多重if:一般用于实现区间判断

语法:

case

when 要判断的条件1 then 返回值1(或语句;)

when 要判断的条件2 then 返回值2(或语句;)

else 返回值n(或语句;)

end(case;)

case结构的特点:

  1. 可以作为表达式:嵌套在其他语句中使用(此时可以放在任何地方使用)
  2. 也可以作为独立的语句来执行:此时只能放在begin end中使用
  3. 如果when中的值满足条件或成立:执行对应的then后面的语句,并结束case

如果都不满足,则执行else后面的语句或值

  1. else可以省略,如果else省略了且所有的条件都不满足时,则返回null

举个栗子

案例1:创建存储过程,根据传入的成绩,来显示等级。比如传入的成绩:90-100,显示A; 80-90 显示B

70-80 显示C,其他 显示D.

表:grade

/**创建**/
create procedure myp(in grade float)
begin 
	case 
	when grade between 90 and 100 then select  'A'
	when grade between 80 and 90 then select 'B'
	when grade between 70 and 80 then select 'C'
	else select  'D'
end $
/**调用**/
call myp(89vel)$

3. if结构

功能:实现多重分支(和java中的多重if一样)

语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n; /**可以省略**/
end if;

应用:只能应用在begin end中

案例:根据传入的成绩,来返回等级。比如传入的成绩:90-100,返回A; 80-90 返回B

70-80 返回C,其他 返回D

/**分析:这里是根据一个传入的值从而返回一个值,因此用函数来实现比较好**/
/**创建**/
begin
    create function f (in score float) returns char
    if score >= 90 and score <= 100 then return 'A';
    elseif score > 80 then return 'B';
    elseif score > 70 then return 'C';
    else return 'D';
    end if;
end $
/**调用**/
select f(80)$

循环结构

循环结构分类:

  1. while
  2. loop
  3. repeat

循环控制:

  1. iterate :类似于continue—>继续 :结束本次循环,继续下次循环
  2. leave :类似于break --> 跳出 :结束当前所在循环

while

1. while

语法:

/**类似于java中的whie**/
【标签】 while 循环条件 do
	循环体
end while【标签】;	

loop

2. loop

语法:

【标签】 loop
 	循环体
 end loop 【标签】;
 /**如果loop里面没有循环控制就是死循环,可搭配leave进行使用,避免死循环**/

repeat

3. repeat

语法:

/**类似于java中的do-while**/
【标签】 repeat
	循环体
until 结束循环的条件
end repeat 【标签】;

举个栗子:

案例一:批量插入,根据次数插入到admin表中多条记录

方法一:没有添加循环控制

/**创建**/
create procedure myp(in time tinyint)
begin
	declare i tinyint default 0;
	while time < i do
		insert into admin(userName,pwd) values(concat('tom',i),'111');
		set i = i+1;
	end while;
end $
/**调用**/
call myp(100)$

方法二:添加循环控制

案例二:批量插入,根据次数插入到admin表中多条记录,如果次数大于20则停止

/**创建**/
create procedure myp(in time tinyint)
begin
	declare i tinyint default 0;
	a: while time < i do
		insert into admin(userName,pwd) values(concat('tom',i),'111');
		if i > 20 then leave a;
		end if;
		set i = i+1;
	end while a;	
end $
/**调用**/
call myp(100)&

案例三:批量插入,根据次数插入到admin表中多条记录,插入偶数次(要求要使用到iterate)

java版本 continue

int i = 0;
while (i <= time){
    i++;
    if(i % 2 != 0){
        continue;
    }
    插入数据;
}

mysql版本 iterate

/**创建**/
create procedure p(in time tinyint)
begin
	declare i tinyint default 0;
	a: while i <= time do
	set i = i+1;
	if MOD(i,2) != 0 then iterate a;
	end if;
	insert into admin(userName,pwd) values(concat('tom',i),'111');
	end while a;
end $
/**调用**/

循环结构的总结

名称语法特点位置
whileLabel:while 循环条件 do 循环体 end whilelabel;先判断后执行begin end中
repeatLabel:repeat 循环体 until 结束循环的条件 end repeat label;先执行后判断begin end中
loopLabel:loop 循环体 end loop label;没有条件的死循环begin end中

循环经典案例

向表stringcontent中添加指定个数的随机字符串

已知表的字段如下:id int primariykey ,content varchar(20)

可能用到的函数

/**创建**/
create procedure myp(in num tinyint)
begin
	/**定义一个循环变量,用于表示插入的次数**/
	set @time = 0;
	/**定义字符串str,用于随机截取**/
	set @str = 'abcdefghijklmnopqrstuvwxyz';
	/**产生一个随机的开始索引,用于从str中截取字符**/
	
	/**产生一个随机长度,用于从str截取满足长度的**/
end$
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值