MYSQL流程控制
一、流程控制结构
1、顺序结构
SQL代码是从上到下、从左至右依次执行
begin…end;相当于{ }。
delimiter // 重定义结束符。 相当于#define
可以嵌套,但必须成套使用,
注意:嵌套内定义的数据,在外层是不可以使用的。
2、选择结构
-
if() … else()…;
-
case <语句>
when <条件1>;
when< 条件2>;
end case;
3、循环结构
for()\while()\do…while();
二、数据库变量
1、局部变量
-
声明定义关键字:declare
-
设置初始值关键字:default
-
基本格式:declare <变量名> 数据类型 [default 初始值]
例如:declare a int default 0;-- 定义一个变量a为0.
注意:局部变量只能在{}内使用。
-
局部变量的赋值
set a=10 ;
2、用户变量
-
生命周期:当前连接.
-
作用域:其定义的复合语句中,只能在begin…end中使用。
-
用户变量的定义和使用:
set @a = 10;(直接使用,不用定义)。
select @a;-- 相当于打印输出语句。明确作用是查询数据
-
用户变量是一个弱类型的变量,万用类型,可以给他赋值任何类型的数据。
3、 会话变量
系统自带的,不能自定义,不能随意改动,是用来保存数据库当前会话的默认数据(字符集,存储引擎),当前连接有效,重新连接会恢复默认值,一般格式:@@会话变量名
查看会话变量: show session variables;
4、全局变量
系统自带的,是用来保存数据库当前服务的默认数据,当前服务有效,重启服务后恢复默认值,一般格式:@@全局变量名
查看全局变量:show global variables;
三、选择结构
1、if…else分支选择结构
-
if语句的基本格式
if<判断条件> then<语句>end if;
-- 判断两个数的最大值
delimiter //
create procedure maxs(in x int,y int)
begin
if(x>y) then select x;
elseif x=y then select x;
else select y;
end if;
end //
delimiter ;
2、case…when 多分枝结构
-- 对成绩评定等级,成绩满分为100,对给定的成绩平等级ABCDE
delimiter //
create procedure scores(in score float)
begin
if score >100||score < 0 then select "成绩输入错误";
else
case score div 10 -- 默认结果是浮点数,需要取整floor
-- select 123 div 10;-- div 是整除。
when 10 then select '优秀' as '评分';
when 9 then select '优秀'as'评分';
when 8 then select '良好'as'评分';
when 7 then select '及格'as'评分';
when 6 then select '及格'as'评分';
else select '不及格'as'评分';
end case;
end if;
end//
delimiter ;
四、循环结构
1、while…do循环结构
while循环基本格式:
while<条件表达式>
do<循环体语句>
end while;
-- 求整数1-100 的和
delimiter //
create procedure test(out sum1 int)
begin
declare i int default 1;
declare s int default 0;
while i<=100
do
set s=s+i;
set i=i+1;
end while;
set sum = s;
end//
delimiter;
2、 loop 循环结构
-
loop的基本格式:
loop<循环体语句>
end loop;
-
loop本质上是一个无线循环,是一个死循环,不自带循环条件,需要在循环中加判断条件。
-- 求整数1-n的和
create procedure test(in n int ,out s int)
delimiter //
begin
declare sum int default 0;
declare i int default 1;
L:loop -- 给循环取个别名L。
set sum = sum+i;
set i = i+1;
if i>n then leave L; -- 相当于break语句。
end if;
end loop;
set s = sum;
end//
delimiter ;
set @n = 10;
call test(@n,20,@su);
select @su;
3、repeat 循环结构
-
基本格式:
repert<循环体语句>;
until <条件表达式>;-- 结束条件。
end repeat;
-
注意repeat语句相当于C语言中的do while 语句,都是先执行一次循环体在进行条件判断,但是不同的是,do while 循环是条件不满足时跳出循环体,而repeat是直到满足条件时跳出循环体。
-- 求n到m的和
delimiter //
create procedure test(inout n int ,m int,s int)
begin
repeat
set s = s+n;
set n = n+1;
until n>m;
end repeat;
end//
4、跳出循环
-
leave 跳出整个循环,相当于C语言中的break。
-
iterate 跳出并结束本次循环,进入下次循环,相当于C语言中的continue。
注意:iterate只能在循环中使用。
以上所说的流程控制时相对于存储过程而言的,流程控制大多数是用于配合存储过程的,因为自定义函数在数据库中使用比较少,大多数都是使用存储过程。
以上仅是我在【六星教育】的学习笔记,仅供参考。如有任何错误,敬请指正。欢迎大家的评价与点评。谢谢!