MySQL流程控制:根据条件控制SQL代码的执行
1、分支流程语句: if、case 其中case有2种语法形式
2、循环流程语句: while/ loop/ repeat
1.1 分支语句 if
if condition then statement_list;
[elseif condition then statement_list...;]
[else statement_list;]
end if;
根据判断条件 true 执行相应语句:
首先判断if,若成立则执行分支; 不成立则向下执行;
if或elseif都不成立,则执行else;
案例A
查询读者信息表:根据用户余额判断用户的会员等级
要求:根据身份证号查询用户余额:
1、余额>=500 金牌会员;
2、余额>=300 高级会员;
3、余额>=200 普通会员;
4、余额<200 不能借书,显示:余额不足
/* if 示例代码: 定义 level_if() */
delimiter //
create function level_if(cid char(18))
returns varchar(10)
begin
declare lev varchar(10);
declare money decimal(7,3);
select balance into money from readerinfo where card_id=cid;
if money<200 then set lev='余额不足';
elseif money<300 then set lev='普通会员';
elseif money<500 then set lev='高级会员';
else set lev='金牌会员';
end if;
return lev;
end //
delimiter ;
1.2 分支语句 case :
case expr
when value then statement_list;
[when value then statement_list...;]
[else statement_list;]
end case;
根据expr条件的结果, 匹配value值,并执行对应语句
案例A的 case 代码:
/* case 示例代码:定义level_case() */
delimiter //
create function level_case(cid char(18))
returns varchar(10)
begin
declare lev varchar(10);
declare money decimal(7,3);
declare num int;
select balance into money from readerinfo where card_id=cid;
set num=truncate(money/100,0);
case num
when 0 then set lev='余额不足';
when 1 then set lev='余额不足';
when 2 then set lev='普通会员';
when 3 then set lev='高级会员';
when 4 then set lev='高级会员';
else set lev='金牌会员';
end case;
return lev;
end //
delimiter ;
1.3 分支语句 case:
case
when expr_condition then statement_list;
[when expr_condition then statement_list...;]
[else statement_list;]
end case;
根据判断expr_condition条件为 true 执行相应语句
案例A的 case 代码2:
/* case 示例代码:定义level_case2() */
delimiter //
create function level_case2(cid char(18))
returns varchar(10)
begin
declare lev varchar(10);
declare money decimal(7,3);
select balance into money from readerinfo where card_id=cid;
case
when money<200 then set lev='余额不足';
when money<300 then set lev='普通会员';
when money<500 then set lev='高级会员';
else set lev='金牌会员';
end case;
return lev;
end //
delimiter ;
2.1 while 循环语句:
[label:]while condition
do statement_list;
end while[label];
判断循环条件,true时执行循环; 否则退出;
也可添加 label 自定义标签 在statement_list 添加 leave
label_name 语句 跳出循环
案例B: 求n以内数的和
/* 案例B的while示例代码: 定义sum_while() */
delimiter //
create function sum_while(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
while num<n do
set num=num+1;
set sum=sum+num;
end while;
return sum;
end //
delimiter ;
2.2 loop 循环语句:
[label:]loop
statement_list;
end loop[label];
无内置循环条件,可在statement_list中添加条件,并通过 leave语句退出循环
label 是自定义标签名
案例B: 求n以内数的和
/* loop示例代码:定义sum_loop() */
delimiter //
create function sum_loop(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
label:loop
set num=num+1;
set sum=sum+num;
if n<num then
leave label; /* 离开 loop 循环 */
end if;
end loop label;
return sum;
end //
delimiter ;
2.3 repeat 循环语句:
[label:]repeat
statement_list;
until condition end repeat[label];
执行1次循环,再判断condition为 true 则退出循环; false 则继续循环;
也可添加 label 自定义标签 在statement_list 添加 leave
label_name 语句 跳出循环
案例B: 求n以内数的和
/* repeat 示例代码: 定义sum_repeat() */
delimiter //
create function sum_repeat(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
repeat
set num=num+1;
set sum=sum+num;
until n<num end repeat;
return sum;
end //
delimiter ;