17 流程控制结构
流程控制结构
分类:
顺序结构:顺序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码
一、分支结构
1. if函数
功能:实现简单的双分支
语法:
SELECT IF(表达式1,表达式2,表达式3,)
执行顺序:
如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值
应用:任何地方
if 函数 if else 的效果
SELECT IF(10>5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金')
FROM employees;
2. case结构
情况1:类似于java中的switch语句,一般用于实现的等值判断
语法:
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1【或语句1;】
WHEN 要判断的值 THEN 返回的值2【或语句2;】
...
ELSE 返回的值N 【或语句n;】
END【CASE;】
/*案例:查询员工的工资 ,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资
*/
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
情况2:类似于java中的多重if语句,一般用于实现区间判断
CASE
WHEN 要判断的条件1 THEN 返回的值1【或语句1;】
WHEN 要判断的条件2 THEN 返回的值2【或语句2;】
...
ELSE 返回的值N【或语句2;】
END【CASE;】
/*
查询:员工的工资情况吧
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别
*/
SELECT salary,
CASE
WHEN salary > 20000 THEN 'A'
WHEN salary > 15000 THEN 'B'
WHEN salary > 10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
#创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩90-700,显示A
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score >= 100 AND score<=100 THEN SELECT 'A';
WHEN score >= 80 THEN SELECT 'B';
WHEN score >= 60 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END $
CALL test_case(95);
特点:
①可以作为表达式;嵌套在其他语句中,可以放在任何地方,BEGIN END 中 或BEGIN END 的外面
可以作为独立的语句去使用,只能放在在BEGIN END 中
②如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE
如果都不满足,则执行ELSE中的语句或值
③ELSE 可以省略,如果ELSE 省略了,并且所有WHEN条件都不满足,则返回NULL
3. if结构
功能:实现多重分支
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
【ELSE 语句n;】
END IF;
#创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩90-700,显示A
CREATE PROCEDURE test_if(IN score INT)
BEGIN
IF score >= 100 AND score<=100 THEN RETURN 'A';
ELSEIF score >= 80 THEN RETURN 'B';
ELSEIF score >= 80 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END
应用场合:应用在begin end中
二、循环结构
分类:
while、loop、repeat
循环控制:
iterate 类似于 continue,结束本次循环,继续下一次
leave 类似于 break 跳出,结束当前所在的循环
对比:
①这三种循环可以省略名称,但如果循环中添加了循环控制语句(leave或 iterate)则必须添加名称
②loop一般用于实现简单的死循环
while 先判断后执行
repeat 先执行后判断,无条件至少执行一次
1. while
语法:
【标签:】WHILE 循环条件 DO
循环体;
END WHILE 【标签】;
#案例:批量插入,根据次数插入到admin表中多条记录
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
SET i=i+1;
END WHILE ;
END $
CALL pro_while(100)$
#2.添加leave语句,根据次数插入到admin表中多条记录
#如果次数大于20,则停止
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL pro_while(100)$
#3.添加iterate语句,
#根据次数插入到admin表中多条记录,只出入偶数次
CREATE PROCEDURE pro_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
END WHILE a;
END $
CALL pro_while(100)$
2. loop
语法:
【标签:】LOOP
循环体;
END LOOP【标签】;
可以用来模拟简单的死循环
3. repeat
语法:
【标签:】REPEAT
循环体;
UNTIL 结束循环的条件
END REPEAT【标签】;
先执行后判断
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)