流程控制结构
顺序结构:程序从上外下执行
分支结构:程序可以从两条或者多条去执行
循环结构:程序在男足一定的条件基础上重复执行一段代码
一、分支结构
1、IF函数
功能:实现简单的双分支
语法:
SELECT IF(表达式1,表达式2,表达式3);
执行顺序:如果表达式1成立则返回表达式2的值,否则返回表达式3的值
应用在任何地方
2、CASE结构
(如果THEN后面加语句则需要用分号结尾)
①类似于java中的switch语句,一般用于实现等值判断
语法:
CASE 变量|表达式|字段
WHEN 判断值 THEN 返回值1或语句1
..........
ELSE 要返回的值n
END CASE;
②类似于java中的多重IF语句,一般用于实现区间判断
CASE
WHEN 判断条件1 THEN 返回值1或语句1
.........
ELSE 返回值n或语句n
END CASE;
特点:
①可以作为表达式,嵌套在其他语句中使用,可以放在任何地方
②可以作为独立的语句去使用,只能放在BEGIN END中使用
③如果要WHEN中的值满足或条件成立则执行THEN后面的语句,并结束CASE,如果都不满足则执行ELSE中的语句或值
④如果ELSE省略且WHEN中的所有条件都不满,则返回NULL
案例:创建存储过程,根据传入的成绩,显示等级
比如传入的90-100显示A,80-90显示B,60-80显示C,否则显示D
DROP PROCEDURE testg1;
DELIMITER $
CREATE PROCEDURE testg1(IN grade INT)
BEGIN
CASE
WHEN grade BETWEEN 90 AND 100 THEN SELECT 'A';
WHEN grade BETWEEN 80 AND 90 THEN SELECT 'B';
WHEN grade BETWEEN 60 AND 80 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END $
CALL testg1(92);
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
DELIMITER $
CREATE FUNCTION testg2(grade INT) RETURNS CHAR
BEGIN
IF grade BETWEEN 90 AND 100 THEN RETURN 'A';
ELSEIF grade BETWEEN 80 AND 90 THEN RETURN 'B';
ELSEIF grade BETWEEN 60 AND 80 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
SELECT testg2(100);
二、循环结构
分类:WHILE、LOOP、REPEAT
循环控制:ITERATE==(CONTINUE)、LEAVE==(break)
1、WHILE
语法:
【标签:】WHILE 循环条件 DO
循环体;
END WHILE【标签】;
2、LOOP
语法:
【标签:】LOOP
循环体;
END LOOP【标签】;
3、REPEAT
语法:
【标签:】REPEAT
循环体;
UNTIL 结束循环条件
END REPEAT【标签】;案例1:批量插入,根据设置的次数,插入到admin表中多条记录
DROP PROCEDURE while1;
DELIMITER $
USE girls$
CREATE PROCEDURE while1(insertcount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<insertcount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('rose',i),'666');
SET i=i+1;
END WHILE a;
END $
CALL while1(10);
添加LEAVE语句
案例2:批量插入,根据设置的次数,插入到admin表中多条记录,如果次数>20则停止
TRUNCATE admin;
DROP PROCEDURE while2;
DELIMITER $
USE girls$
CREATE PROCEDURE while2(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 while2(100);
3、添加ITERATE语句
案例2:批量插入,根据设置的次数,插入到admin表中多条记录,只插入偶数次的语句
TRUNCATE admin;
DROP PROCEDURE test3;
DELIMITER $
USE girls$
CREATE PROCEDURE test3(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('xwg',i),i*3);
END WHILE a;
END $
CALL test3(20);
案例:已知表stringcontent表,字段id 自增长,content VARCHAR(20),向该表插入指定个数的随机字符串
USE test;
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
TRUNCATE stringcontent;
DROP PROCEDURE insert_to_sc;
DELIMITER $
CREATE PROCEDURE insert_to_sc(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1; #i表示插入的次数
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE setindex INT DEFAULT 1; #代表起始索引
DECLARE len INT DEFAULT 1; #代表截取长度
a:WHILE i<num DO
SET setindex=FLOOR(RAND()*26+1);
SET len=FLOOR(RAND()*(20-setindex+1)+1);
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,setindex,len));
SET i=i+1;
END WHILE a;
END $
CALL insert_to_sc(10);
来源:CSDN
作者:小顽固哥
链接:https://blog.csdn.net/qq_41825534/article/details/104906511