十一、流程控制结构

介绍

顺序结构:程序从上至下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

分支结构

一、if函数

功能:

实现简单的双分支

语法:

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

执行顺序:

如果表达式1成立,返回表达式2的值,否则返回表达式3的值

应用场景:

任何地方

二、case函数

功能:

1、一般用于实现等值判断
2、一般用于实现区间判断(多重 if 判断)

特点:

① 可以作为表达式,嵌套在其它语句中使用,可放在任何地方,也可作为独
立的语句去使用,只能放在begin end中。
② 如果 when 中的值满足或者成立,则执行对应的then后面的语句,并且结
束case,如果都不满足,则执行else语句或值。
③ else可以省略,如果else省略了并且所有when条件都不满足则返回null

语法:

情况1:用于实现等值判断
case 变量|表达式|字段
when 要判断的值 then 返回值1或语句1
when 要判断的值 then 返回值2或语句2
.....
else 返回值n
end
情况2:用于实现区间判断
case
when 要判断的条件1 then 返回值1或语句1
when 要判断的条件2 then 返回值2或语句2
.....
else 返回值n
end

执行顺序:

如果表达式1成立,返回表达式2的值,否则返回表达式3的值

应用场景:

任何地方

三、if结构

功能:实现多重分支

语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;
......
else 语句n;
end if;

应用场景:

在存储过程或函数begin end 中。

循环结构

分类

while、loop、repeat

循环控制

iterate,跳出本次循环,继续下次循环
leave,结束当前循环
while

语法

【标签:】while 循环条件 do
循环体;
end while【标签】;
loop

语法

【标签:】loop
循环体;
end loop【标签】;
repeat

语法

【标签:】repeat
循环体;
until 结束循环的条件
end repeat【标签:】;

案例

1、批量插入,根据传入循环次数插入到 admin 表中多条记录

# 查询 admin 表信息
select * from admin;
Empty set   # 结果是空的,没有任何数据
# 创建存储过程
create procedure pro_while(in while_num int)
begin
	declare i int default 1;
	while i <= while_num do
            insert into admin(username, `password`) values(concat('demo', i), concat('666', i));
		set i = i + 1;
	end while;
end
# 执行存储过程
call pro_while(5);
# 查询 admin 表信息
select * from admin;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | demo1    | 6661     |
|  2 | demo2    | 6662     |
|  3 | demo3    | 6663     |
|  4 | demo4    | 6664     |
|  5 | demo5    | 6665     |
+----+----------+----------+

2、批量插入,根据传入循环次数插入到 admin 表中多条记录,如果 次数 > 6 则停止

# 查询 admin 表信息
select * from admin;
Empty set   # 结果是空的,没有任何数据
# 创建存储过程
create procedure pro_while(in while_num int)
begin
	declare i int default 1;
    flag:while i <= while_num do
        if i > 6 then leave flag;
        end if;
        insert into admin(username, `password`) values(concat('demo', i), concat('666', i));
        set i = i + 1;
	end while flag;
end
# 执行存储过程
call pro_while(15);
# 查询 admin 表信息
select * from admin;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | demo1    | 6661     |
|  2 | demo2    | 6662     |
|  3 | demo3    | 6663     |
|  4 | demo4    | 6664     |
|  5 | demo5    | 6665     |
|  6 | demo6    | 6666     |
+----+----------+----------+

3、批量插入,根据传入循环次数插入到 admin 表中多条记录,只插入偶数次

# 查询 admin 表信息
select * from admin;
Empty set   # 结果是空的,没有任何数据
# 创建存储过程
create procedure pro_while(in while_num int)
begin
	declare i int default 0;
	flag:while i <= while_num do
		set i = i + 1;
		if mod(i, 2) != 0 # i 对 2 取余
		then iterate flag;
		end if;
		insert into admin(username, `password`) values(concat('demo', i), concat('666', i));
	end while flag;
end
# 执行存储过程
call pro_while(15);
# 查询 admin 表信息
select * from admin;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | demo2    | 6662     |
|  2 | demo4    | 6664     |
|  3 | demo6    | 6666     |
|  4 | demo8    | 6668     |
|  5 | demo10   | 66610    |
|  6 | demo12   | 66612    |
|  7 | demo14   | 66614    |
|  8 | demo16   | 66616    |
+----+----------+----------+

4、repeat循环批量插入

# 创建
create procedure pro_while(in while_num int)
begin
	declare i int default 0;
	flag:repeat
		insert into admin(username, `password`) values(concat('demo', i), concat('666', i));
		set i = i + 1;
	until i > while_num end repeat flag;
end
# 调用
call pro_while(15);

5、loop循环批量插入

# 创建
create procedure pro_while(in while_num int)
begin
	declare i int default 0;
	flag:loop
        insert into admin(username, `password`) values(concat('demo', i), concat('666', i));
        set i = i + 1;
        if i > while_num then leave flag;
        end if;
	end loop flag;
end
# 调用
call pro_while(15);

循环结构总结

名称 语法 特点 位置
while lebel:while loop_condition do loop_listend while lebel; 先判断后执行 begin end中
repeat label:repeat loop_listuntil end_conditionend repeat label; 先执行后判断 begin end中
loop label:loop loop_listend loop label; 没有条件的死循环 begin end中

小练习

创建表 demo 其中字段包括:id、content
向该表插入指定个数的随机字符串

# 创建 demo 表
create table demo(
  id int(11) primary key auto_increment,
  contnet varchar(20) not null
)
# 创建存储过程
create procedure insert_demo(in insert_count int)
begin
	# 定义循环变量,表示插入次数
	declare i int default 1;
	
	# 定义所有字符
	declare str varchar(26) default 'abcdefghijklmnopqrstuvwxyz';
	
	# 代表起始索引
	declare start_index int default 1;
	
	# 代表截取的字符长度
	declare len int default 1;
	
	# 实际插入内容
	declare content varchar(20) default '';
	
	while i <= insert_count do
        # 随机数,向下取整 rend()产生值 * 26 + 1
        set start_index = floor(rand() * 26 + 1);
		
        # 产生随机整数,代表截取长度,1 - (26 - start_index + 1)
        set len = floor(rand() * (20 - start_index + 1) + 1);
		
        # 产生随机整数,代表起始索引1~26
        set content = subsrt(str, start_index);
		
        insert into demo(`content`) value(content);
		
        # 循环变量更新
        set i = i + 1;
	end while;
end
# 执行存储过程
call insert_demo(5);
# 查询 demo 表
select * from demo;
+----+-------------+
| id | content     |
+----+-------------+
|  1 | bcdefgh     |
|  2 | mnopqrs     |
|  3 | hij         |
|  4 | fghijk      |
|  5 | pqrstuvwxyz |
+----+-------------+
posted @ 2019-09-15 18:09  achnly  阅读(250)  评论(0编辑  收藏  举报