四.循环结构
1.while·····do循环结构
while循环基本格式:
while 条件表达式 do 循环语句 end while;
如果while之后的条件满足则循环执行do之后的循环体语句,直到条件不满足则结束循环。
数据库中的while循环和c语言中的while循环一样。
例如:求数字1到100的和
-- while循环 delimiter // create procedure test(in s int,out s2 int) begin declare i int default 1; declare su int default 0; while i<=s do set su=su+i; set i=i+1; end while; set s2=su; end // delimiter ; call test(100,@n); select @n;
2.loop循环
loop循环的结构
①.loop循环基本格式:
loop 循环语句; end loop;
注意:这里的loop循环时一个无限循环(死循环),其没有结束符,所以需要手动添加结束条件;
②.给loop循环手动添加结束条件
循环别名:loop 循环条件; if 条件表达式 then leave 循环别名; end if; end loop;
首先执行loop之后的循环体语句,循环体语句中的if条件满足则leave离开循环,否则继续循环;
代码演示:
-- loop循环; -- 求1到n中的质数; delimiter // create procedure section(in n int) begin declare i int default 1; S:loop set i=i+1; if i%2=0 then iterate S; -- iterate和c语言中的continue相似; else select i; end if; if i>n then leave S; end if; end loop; end // delimiter ; call section(100);
3.repeat循环
repeat循环的基本格式:
repeat 循环体语句; until 条件表达式; end repeat;
首先执行repeat之后的循环体语句,然后判断until之后的条件,如果条件不满足则继续循环,否则条件满足则结束循环。
#注意:repeat循环相当于c语言中的do···while循环语句,都是先执行一次循环体然后再进行条件判断,但是不同的是,do while循环是条件不满足时跳出循环,repeat循环是条件满足时才结束循环,并且until后不能有;号。
例如:求整数n到m的和;
-- repeat循环; -- 求n到m的和; delimiter // create procedure sumall(in n int,in m int,out a int) begin declare ss int default 0; declare i int default n; repeat set ss=ss+i; set i=i+1; set a=ss; until i>m end repeat; end// delimiter ; call sumall(10,80,@a); select @a;
4.跳出语句
①.leave
leave的基本格式:
leave 别名;
离开别名所代表的结构,别名可以代表语句块或循环;
相当于c语言中的break语句,用于跳出整个循环,结束整个循环;
②.iterate
iterate的基本格式:
iterate 别名;
相当于c语言中的continue语句,用于跳出本次循环,执行下一次的循环。
总结
本节我们学习了MySQL数据库中的流程控制,MySQL数据库的讲解基本就到这里了,下一节是关于如何将数据库和VS连接的教程。本节的代码会附在后面,大家可以去尝试理解.
代码浮现 use db_2; -- 使用数据库; #局部变量的使用 -- 在存储过程中使用局部变量完成某些操作; delimiter // create procedure sum3(in x int,in y int) begin declare z int default 0; -- 定义一个局部变量并初始化为0; set z=x+y; -- 给z赋值; select z as "两数的和"; end// delimiter ; call sum3(123,345); -- 使用用户变量; delimiter // create procedure sum4(in x int,in y int,out z int) begin set z=x+y; end// delimiter ; set @a=10; set @b=390; call sum4(@a,@b,@c); select @c as"两数之和"; -- 用用户变量来接收存储过程返回的值; -- 会话变量的查看; show session variables; select @@admin_port; -- 从数据库系统中选择的会话变量; #分支结构的使用 delimiter // create procedure get_grade1(in score float,out grade varchar(20)) begin declare s int default 0; set s=score div 10; -- 整除; if s=9 then set grade="优秀"; elseif s=8 then set grade="优"; elseif s=7 then set grade='良'; else if s=6 then set grade='及'; else set grade='不及格'; end if; end // delimiter ; call get_grade1(78,@ss); select @ss; /*Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'then set grade="不及格"; end if; end' at line 9 */ delimiter // create procedure sention(in score int) begin declare s int default 0; set s=score div 10; case s when 10 then select '满分' as 成绩等级; when 9 then select '优秀' as 成绩等级; when 8 then select '良好' 成绩等级; when 7 then select '及格' 成绩等级; when 6 then select '及格' 成绩等级; else select '不及格' 成绩等级; end case; end // delimiter ; call sention(99); #循环结构 -- while循环 delimiter // create procedure test(in s int,out s2 int) begin declare i int default 1; declare su int default 0; while i<=s do set su=su+i; set i=i+1; end while; set s2=su; end // delimiter ; call test(100,@n); select @n; -- loop循环; -- 求1到n中的质数; delimiter // create procedure section(in n int) begin declare i int default 1; S:loop set i=i+1; if i%2=0 then iterate S; -- iterate和c语言中的continue相似; else select i; end if; if i>n then leave S; end if; end loop; end // delimiter ; call section(100); -- repeat循环; -- 求n到m的和; delimiter // create procedure sumall(in n int,in m int,out a int) begin declare ss int default 0; declare i int default n; repeat set ss=ss+i; set i=i+1; set a=ss; until i>m end repeat; end// delimiter ; call sumall(10,80,@a); select @a;