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【标签】;

先执行后判断

posted @   flypiggg  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示