流程控制结构
1.顺序结构
2.分支结构
3.循环结构
一、分支结构
1.if 函数
功能:简单的双分支
语法:if(表达式1,表达式2,表达式3)
执行顺序:如果表达式1成立,返回表达式2,否则返回表达式3
应用:任何地方
2. case结构
情况1:实现等值判断,类似于switch语句
case 字段|变量|表达式
when 常量1 then 语句1;
when 常量2 then 语句2;
……
else 语句n;
end case;
情况2:实现区间判断,类似于多重if语句
case
when 条件1 then 语句1;
when 条件2 then 语句2;
……
else 语句n;
end case;
特点:
1.每条语句后面加分号,最后用end case结尾 ,而不用end
2.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,放在begin end 中或者之外
3.可以独立使用,只能放在begin end中
执行顺序:
如果when中的条件之一满足,执行后直接跳出
如果都不瞒满足,则执行else中的语句,如果没有else则返回null
案例:创建存储过程,根据传入的成绩显示等级,
90-100:A,80-90:B,60-80:C,否则显示D
DROP PROCEDURE myp_grade$
CREATE PROCEDURE myp_grade(IN score INT )
BEGIN
CASE
WHEN score BETWEEN 90 AND 100 THEN SELECT 'A';
WHEN score BETWEEN 80 AND 90 THEN SELECT 'B';
WHEN score BETWEEN 60 AND 80 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END$
CALL myp_grade(97)$
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 FUNCTION myfun_grede(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$
SELECT myfun_grede(86)$
二、循环结构
分类:
while ,loop ,repeat
循环控制:
iterate:continue 结束本次循环,进入下次循环
leave:break 跳出循环结构
1、while
【标签:】while 循环条件 do
循环体;
end while 【标签】;
2.loop
【标签:】loop
循环体;
end loop 【标签】;
可以用来模拟死循环,想要结束 + leave
3.repeat
【标签:】 repeat
循环体;
until 结束循环的条件
end repeat【标签】;
类似于do while 先执行一次,
案例练习
1、没有循环控制结构
案例:批量插入,根据次数在admin中插入多条记录
因为没有返回值,所以创建存储过程
DROP PROCEDURE pro_while$
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) ,'777');
SET i = i + 1;
END WHILE;
END$
/*
int i = 1
while (i <=insertCount){
//insert
i++
}
其他语言中的一般写法
*/
CALL pro_while(10)$
SELECT * FROM admin$
2,添加循环控制
上一个案例,在插入次数大于5时停止
TRUNCATE TABLE admin$
SELECT * FROM admin$
DROP PROCEDURE leave_while$
CREATE PROCEDURE leave_while(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i <= insertCount DO
INSERT INTO admin (username,`password`) VALUES(CONCAT('Fox',i),'8888');
IF i >=5 THEN LEAVE a;
END IF;
SET i = i+1;
END WHILE a;
END$
CALL leave_while(10)$
iterate
上面的案例只插入偶数次的索引
TRUNCATE TABLE admin$
SELECT * FROM admin$
CREATE PROCEDURE iterate_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('Fox',i),'8888');
END WHILE a;
END$
CALL iterate_while(10)$
案例练习
1,已知表strcontent,字段:id 自增长,content varchar(20),向该表插入指定个数的随机字符串
DROP TABLE IF EXISTS strcontent;
CREATE TABLE strcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DELIMITER $
DROP PROCEDURE test_randstr$
CREATE PROCEDURE test_randstr( IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE start_index INT DEFAULT 1;#代表起始索引
DECLARE len INT DEFAULT 1;#代表截取的字符的长度
WHILE i <= insertCount DO
SET len = FLOOR(RAND()*(20-start_index+1)+1);
#产生随机数,代表可以截取的长度(20-start_index)+1
#因为要求是varchar(20)
SET start_index = FLOOR(RAND()*26+1);
#rand()[0-1)之间的值,无限接近于1
#floor()向下取整 [0-26]
INSERT INTO strcontent (content)
VALUES (SUBSTR( str,start_index,len));
SET i = i+1;
END WHILE;
END$
CALL test_randstr(5)$
SELECT * FROM strcontent$
三种循环结构的对比
1.三种循环都可以省略名字,但当有循环控制结构时不可省略
-
loop:简单的死循环
while:先判断再执行
repeat:先执行再判断,即至少无条件执行一次