流程控制结构
分类
顺序结构:程序从上往下依次执行;
分支结构:程序从两条或多条路径中选择一条去执行;
循环结构:程序在满足一定条件的基础上,重复执行一段代码;
分支结构
#1.IF函数
功能:实现简单的双分支;
--------------------------------
语法: IF(表达式1,表达式2,表达式3)
执行顺序: 如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值;
---------------------------------
应用:任何地方
#2.CASE结构
情况1:类似于SWITCH语句,一般用于实现等值判断
--------------------------------------------
语法:
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1
WHEN 要判断的值 THEN 返回的值2
.....
ELSE 要返回的值n
END CASE;
---------------------------------------------
情况2:类似于多重IF语句,一般用于实现区间判断
---------------------------------------------
语法:
CASE
WHEN 要判断的条件1 THEN 返回的值1或语句1;
WHEN 要判断的条件2 THEN 返回的值2或语句2;
-----
ELSE 要返回的值n或语句n;
END CASE;
-----------------------------------------------
特点:
可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中或BEGIN END 外面;
可以作为独立的语句去使用,只能放在BEGIN END 中使用;
ELSE 可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NULL
#3.IF结构
功能
实现多重分支
语法
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
....
[ELSE 语句n;]
END IF;
应用场景
应用在BEGIN END中
分支结构-案例
#案例:创建存储过程,根据传入的成绩,来显示等级.
90-100,显示A;80-90显示B;60-80显示C,否则,显示D;
---------------------------------------------------------
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score>=90 AND score <= 100 THEN SELCET 'A';
WHEN score>=80 THEN SELECT 'B';
WHEN score>=60 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE:
END $
案例:根据传入的成绩,来返回级别,比如传入的成绩:90-100 返回A;80-90 返回B;60-80返回C;否则返回D'
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
IF score>90 AND score <= 100 THEN RETURN 'A';
ELSEIF score >= 80 THEN RETURN 'B';
ELSEIF score >= 60 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
循环结构
分类
WHILE
LOOP
REPEAT
循环控制:
ITERATE 类似于 CONTINUE ,继续,结束本次循环,继续下一次;
LEAVE 类似于 BREAK,跳出,结束当前所在的循环;
循环结构-WHILE
语法
[标签:]WHILE 循环条件 do
循环体
END WHILE [标签];
循环结构-LOOP
语法
[标签:]LOOP
循环体
END LOOP [标签];
---------------------
可以用来模拟简单的死循环
循环结构-REPEAT
语法
[标签:] REPEAT
循环体;
UNTIL 循环结束条件
END REPEAT [标签];
------------------------------
至少执行一次
循环结构-案例
#1.案例:批量插入,根据次数为admin表插入多条记录
=1= 不添加循环控制语句
-----------------------------------------------------
CREATE PROCEDURE pro_while1(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 $
=2= 添加循环控制语句
-------------------------------------------------------
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i < insertCount DO
INSERT INTO admin(username,'password') VALUES(CONCAT('lq',i),'0000');
IF i >= 20 THEN LEAVE a;
END IF
SET i = i+1;
END WHILE a;
END $
=3= 添加ITERATE语句
要求只插入偶数次
----------------------------------------------------
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHIEL i <=insertCount DO
SET i = i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,'password') VALUES(CONCAT('lq',i),'0000');
END WHILE a;
END $
循环结构-总结
流程控制经典案例
已知表stringcontent 其中字段:
id 自增长
content varchar(20)
要求:向该表插入指定个数的,随机的字符串
--------------------------------------------
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1; //定义一个循环变量 i,表示插入次数
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT DEFAULT 1; //代表起始索引
DECLARE len INT DEFAULT 1;//代表截取的字符的长度
WHILE i<= insertCount DO
SET len = FLOOR(RAND()*(20-startIndex+1)+1);//产生一个随机的整数,代表截取长度,1 -(20-startIndex+1)
SET startIndex = FLOOR(RAND()*26+1);//产生一个随机的整数,代表起始索引 1-26
INSERT INTO stringconeten(content) VALUES();
SET i = i +1;//循环变量更新
END WHILE;
END $