MySQL:流程控制结构
流程控制语句
顺序结构
程序自上往下依次执行
分支结构
介绍
程序从两条或多条路径中选择一条执行
if语句
/* 语法: IF(表达式1,表达式2,表达式3) 执行顺序: 如果表达式1成立,则返回表达式2的值,否则返回表达式3的值 应用:在任何地方 */
IF THEN
/* 语法: IF 条件1 THEN 语句1; ELSEIF 条件2 THEN 语句2; ... ELSE 语句n; END IF; 应用在begin end中 */
case
/* 情景1: 类似switch语句,实现等值判断 CASE 变量|表达式|字段 WHEN 要判断的值 THEN 返回值1或语句1; WHEN 要判断的值 THEN 返回值2或语句2; ... ELSE 要返回的值n或语句n; END CASE; 情景2: 类似多重if语句,实现区间判断 CASE WHEN 要判断的条件1 THEN 返回值1或语句1; WHEN 要判断的条件2 THEN 返回值2或语句2; ... ELSE 要返回的值n或语句n; END CASE; 特点: 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END里面或者外面; 可以作为独立的语句去使用,只能放在BEGIN ENG中; 如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并结束CASE; ELSE可以省略,如果else省略了,并且所有的WEHN条件都不满足,则返回NULL; */
循环结构
介绍
程序在满足一定条件的基础上,重复执行一段代码
循环控制
- iterate类似于continue,结束本次循环,继续下一次
- leave 类似于break,结束当前所在的循环
while
/* 语法: 【标签:】 while 循环条件 do 循环体; end while [标签]; */
loop
/* 语法: 【标签:】 loop 循环体; end loop[标签]; 用来模拟死循环 */
repeat
/* 语法: 【标签:】 repeat 循环体; until 结束循环的条件 end repeat [标签]; */
案例
#1.没有添加循环控制语句 #案例:批量插入,根据次数插入到admin表中多条记录 DROP PROCEDURE pro_while1$ 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)$ #2.添加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)$ #3.添加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 WHILE a; END $ CALL test_while1(100)$
案例
/*一、已知表stringcontent 其中字段: id 自增长 content varchar(20) 向该表插入指定个数的,随机的字符串 */ DROP TABLE IF EXISTS stringcontent; 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;#代表初始索引 DECLARE len INT;#代表截取的字符长度 WHILE i<=insertcount DO SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26 SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-(20-startIndex+1) INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len)); SET i=i+1; END WHILE; END $ CALL test_randstr_insert(10)$