18 MySQL 流程控制

本文详细介绍了MySQL中的流程控制,包括分支语句(if, case)和循环语句(while, loop, repeat)。通过具体的案例分析了如何根据条件控制SQL代码的执行,如会员等级判断和求和运算,帮助读者更好地理解和应用这些语句。" 50962742,442410,GlusterFS与Ceph:分布式文件系统的对比,"['分布式存储', '文件系统', 'Ceph-mon', '一致性哈希', 'Paxos', 'coroutine']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值