流程控制结构
顺序、分支、循环 | 描述 |
---|---|
顺序结构 | 程序从上往下依次执行 |
分支结构 | 程序从两条或多条路径中选择一条去执行 |
循环结构 | 程序在满足一定条件的基础上,重复执行一段代码 |
一、分支结构
1.if函数
语法:IF(条件,值1,值2)
功能:实现双分支
应用在BEGIN END中或外面
2.case结构
语法:
情况1:类似于switch,一般实现等值判断
CASE 变量或表达式
WHEN 值1 THEN 返回的值1或语句1;
WHEN 值2 THEN 返回的值2或语句2;
...
ELSE 语句n;
END
情况2:一般实现区间判断
CASE
WHEN 条件1 THEN 返回的值1或语句1;
WHEN 条件2 THEN 返回的值2或语句2;
...
ELSE 语句n;
END
特点:
- 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGINEND中或BEGINEND的外面
语法 | 位置 | |
---|---|---|
情况1 | CASE 表达式 WHEN 值1 THEN 值1 WHEN 值2 THEN 值2 … ELSE 值n END; | BEGIN END中,BEGIN END 外面 |
情况2 | CASE WHEN 值1 THEN 条件1 WHEN 值2 THEN 条件2 … ELSE 值n END; | BEGIN END中,BEGIN END 外面 |
- 可以作为独立的语句去使用,只能放在BEGINEND中
语法 | 位置 | |
---|---|---|
情况1 | CASE 表达式 WHEN 值1 THEN 语句1; WHEN 值2 THEN 语句2; … ELSE 语句n; END CASE; | BEGIN END中 |
情况2 | CASE WHEN 条件1 THEN 语句1; WHEN 条件2 THEN 语句2; … ELSE 语句n; END CASE; | BEGIN END中 |
- 如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE;如果都不满足,则执行ELSE中的语句或值
- ELSE可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NUL!
案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE PROCEDURE test_case1(IN score FLOAT)
BEGIN
CASE
WHEN score>=90 THEN SELECT "A";
WHEN score>=80 THEN SELECT "B";
WHEN score>=60 THEN SELECT "C";
ELSE SELECT "D";
END CASE;
END $
CALL test_case1(86)$
等价
CREATE FUNCTION test_case2(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $
SELECT test_case(86)$
3.if结构
功能:实现多重分支,类似于多重IF,只能应用在BEGIN END 中
语法:
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
....
ELSE 语句n;
END IF;
案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSE SET ch='D';
END IF;
RETURN ch;
END $
#调用
SELECT test_if(87)$
案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGIN
IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
END IF;
END $
CALL test_if_pro(2100)$
二、循环结构
分类:
WHILE、LOOP、REPEAT
循环控制:
ITERATE类似于CONTINUE,继续,结束本次循环,继续下一次
LEAVE类似于break,跳出,结束当前所在的循环
联想其他语言,如C语言:
INT i=1;
WHILE(i<=a){
循环语句
i++;
}
1.while
语法:
【标签(名称):】WHILE 循环条件 DO
循环体;
END WHILE【标签(名称)】;
2.loop
语法:
【标签:】LOOP
循环体;
END LOOP 【标签】;
可以用来模拟简单的死循环
3.repeat
语法:
【标签:】REPEAT
循环体;
UNTIL 结束循环的条件
END REPEAT 【标签】;
1.没有添加循环控制语句
案例:批量插入,根据次数插入到admin表中多条记录
DROP PROCEDURE test_while1$
USE `girls`$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#定义一个局部变量
a_name:WHILE i<=insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;#更新i
END WHILE a_name;
END $
CALL test_while1(10)$
SELECT * FROM admin$
2.添加LEAVE语句(LEAVE类似于break,跳出)
案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;#定义一个i,默认1
a_name:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('小tan',i),'0000');
IF i>=20 THEN LEAVE a_name;#如果次数>20则停止
END IF;
SET i=i+1;
END WHILE a_name;
END $
CALL test_while1(100)$
SELECT * FROM admin$
3.添加ITERATE语句(ITERATE类似于CONTINUE,继续)
案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a_name:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a_name;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('小tan',i),'0000');
END WHILE a_name;
END $
CALL test_while1(100)$
SELECT * FROM admin$
循环总结
名称 | 语法 | 特点 | 位置 |
---|---|---|---|
WHILE | Label:WHILE loop_condition DO LOOP LIST END WHILE label; | 先判断后执行 | BEGIN END中 |
REPEAT | Label:REPEAT LOOP LIST UNTIL END CONDITION END REPEAT label; | 先执行后判断 | BEGIN END中 |
LOOP | Label:LOOP loop_list END LOOP label; | 没有条件的死循环 | BEGIN END中 |
练习
一、已知表stringcontent
其中字段:
id 自增长
content VARCHAR(20)
向该表插入指定个数的,随机的字符串
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DROP PROCEDURE my1$
CREATE PROCEDURE my1(IN a INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE startindex INT DEFAULT 1;
DECLARE len INT DEFAULT 1;
DECLARE str VARCHAR(10) DEFAULT "abcdefghij";
WHILE i<=a DO
#rand函数随机产生一个0-1的数字
SET startindex=FLOOR(RAND()*10+1);#代表初始索引,随机范围1-10
SET len=FLOOR(RAND()*(5-startindex+1)+1);#代表截取长度
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startindex,len));
SET i=i+1;
END WHILE;
END$
CALL my1(10)$
SELECT * FROM stringcontent$
来源:CSDN
作者:卖山楂啦prss
链接:https://blog.csdn.net/qq_42374697/article/details/104342369