MySQL数据库——流程控制结构
#流程控制结构 顺序结构:程序从上往下依次执行 分支结构:程序从两条或多条路径中选择一条去执行 循环结构:程序在满足一定的条件基础上重复执行一段代码 #分支结构 1.if函数 功能:实现简单的双分支 SELECT IF(表达式1,表达式2,表达式3) 执行顺序:如果表达式1成立,返回表达式2的值,否则返回表达式3的值 应用:任何地方 2.case结构 情况1:类似于Java中的switch语句,一般用于实现等值判断 语法: CASE 变量|表达式|字段 WHEN 要判断的值 THEN 返回的值1或语句1; WHEN 要判断的值 THEN 返回的值2或语句2; ... ELSE 要返回的值n或语句n; END CASE; 情况2:类似于Java中的多重IF语句,一般用于实现区间判断 语法: CASE WHEN 要判断的条件1 THEN 返回的值1或语句1; WHEN 要判断的条件2 THEN 返回的值2或语句2; ... ELSE 要返回的值n或语句n; END CASE; 特点: ① 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END中或BEGIN END外面 可以作为独立的语句去使用,只能放在BEGIN END中 ② #如果when中的值或条件成立,则执行对应的then后面语句,并且执行case 如果都不满足,则执行ELSE中的语句 ③ 如果ELSE省略并且所有的WHEN条件都不满足,则返回NULL #案例: #创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩在90-100A,80-90B,60-80C,否则D CREATE PROCEDURE test_case(IN score INT) BEGIN CASE WHEN score<=100 AND score >=90 THEN SELECT 'A'; WHEN score <90 AND score >=80 THEN SELECT 'B'; WHEN score >=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $ CALL test_case(94) $ 3.if结构 功能:实现多重分支,完全跟Java一样 语法: IF 条件1 THEN 语句1; ELSEIF 条件2 THEN 语句2; ... 【ELSE 语句n;】 应用:只能应用在BEGIN END中 #案例:根据传入的成绩,来返回等级,比如传入的成绩在90-100A,80-90B,60-80C,否则D CREATE FUNCTION test_if(score INT) RETURNS CHAR BEGIN IF score >= 90 AND score <= 100 THEN RETURN 'A'; ELSEIF score <90 AND score >=80 THEN RETURN 'B'; ELSEIF score >=60 THEN RETURN 'C'; ELSE RETURN 'D'; END IF; END $ #循环结构 分类: #while/loop/repeat 循环控制: ITERATE类似于CONTINUE继续,结束本次循环,继续下一次 LEAVE类似于break,跳出,结束当前所在的循环 1.while 语法: 标签:WHILE 循环条件 DO 循环体; END WHILE 标签; 写上标签可以搭配循环控制使用,也可以不加。 2.loop 语法: 标签:LOOP 循环体; END LOOP 便签; 可以用来模拟简单的死循环 3.repeat 语法: 标签:REPEAT 循环体; UNTIL 结束循环的条件 END REPEAT 标签; #类似于do while,肯定能执行一次。 #while演示: 批量插入,根据设置次数插入到admin表中多条记录 无循环控制语句 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 $ CALL pro_while1(100)$ 添加LEAVE语句 批量插入,根据设置次数插入到admin表中多条记录,如果次数大于20则停止 TRUNCATE TABLE admin $ DROP PROCEDURE test_while1 $ 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('xiaohua',i),'0000'); IF i >=20 THEN LEAVE a; END IF; SET i=i+1; END WHILE a; END $ CALL test_while1(100)$; 添加ITERATE语句 批量插入,根据设置次数插入到admin表中多条记录,直插入偶数次 TRUNCATE TABLE admin $ DROP PROCEDURE test_while1 $ CREATE PROCEDURE test_while1(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('xiaohua',i),'0000'); END IF; END WHILE a; END $ CALL test_while1(100)$;
经典案例:
/* 一、已知表stringconteng 其中字段: 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; 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); INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len)); SET i=i+1; END $ CALL test_randstr_insert(10)$