流程控制结构
#流程控制结构 /* 顺序结构:程序从上往下依次执行 分支结构:程序从两条或多条路径中选择一条去执行 循环结构:程序在满足一定条件的基础上,重复执行一段代码 */ #一、分支结构 #1、if函数 /* 功能:实现简单的双分支 语法: if(表达式1,表达式2,表达式3) 执行顺序: 如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值 应用:任何地方 */ #2、case结构 /* 情况1:类似于java中的switch语句,一般用于实现的等值判断 语法: case 变量|表达式|字段 when 要判断的值 then 返回的值1或语句1; #是语句 end 后加 case 放在begin end中 ... else 要返回的值n或语句n; end case; 情况2:类似于java中的多重if语句,一般用于实现区间判断 CASE WHEN 要判断的条件1 THEN 返回的值1或语句1 #是语句 end 后加 case 放在begin end中 ... ELSE 要返回的值n或语句n END case; 特点: 1、可以作为表达式,嵌套在其他语句中使用,begin end 中 或 begin end 外面 2、可以作为独立的语句去使用,只能放在 begin end 中 3、else 可以省略,如果else省略了,并且所有when条件都不满足,则返回null */ #创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩:90-100,显示A,80-90,显示B,60-80,显示C,否则显示D DELIMITER $ CREATE PROCEDURE test_case(IN score INT) BEGIN CASE WHEN score >=90 AND score <= 100 THEN SELECT 'A'; WHEN score >=80 THEN SELECT 'B'; WHEN score >=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; # then后是语句,end 后加 case END $ CALL test_case(59); #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 test_if(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 if END $ SELECT test_if(59); #二、循环结构 /* 分类: while、loop、repeat 循环控制: iterate类似于continue,继续,结束本次循环,继续下一次 leave 类似于 break,跳出,结束当前所在的循环 位置: 只能在 begin end 中 */ #1、while /* 语法: 【标签:】while 循环条件 do 循环体; end while【标签】; 类似于 java 的 while 循环,先判断后执行 */ #2、loop /* 语法: 【标签:】loop 循环体; end loop【标签】; 类似于 java 的 死 循环,没条件的死循环 */ #3、repeat /* 语法: 【标签:】repeat 循环体; until 结束循环的条件; end repeat【标签】; 类似于 java 的 do while 循环,先执行后判断 */ #1、没有添加循环控制语句 #批量插入,根据次数插入到admin表中多条记录 #drop procedure if exists pro_while1; DELIMITER $ 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); SELECT * FROM admin; #2、添加leave语句 #批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止 TRUNCATE TABLE admin; DROP PROCEDURE IF EXISTS pro_while1; DELIMITER $ CREATE PROCEDURE pro_while1(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; # default 1 a:WHILE i<=insertCount DO INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000'); SET i = i+1; IF i>20 THEN LEAVE a; END IF; END WHILE a; END $ CALL pro_while1(100); SELECT * FROM admin; #3、添加iterate语句 #批量插入,根据次数插入到admin表中多条记录,只插入偶数 TRUNCATE TABLE admin; DROP PROCEDURE IF EXISTS pro_while1; DELIMITER $ CREATE PROCEDURE pro_while1(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 0; # 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 pro_while1(100); SELECT * FROM admin; /* 已知表stringcontent 其中字段: id:自增长 content varchar(20) 向该表插入指定个数的,随机字符串 */ DROP TABLE IF EXISTS stringcontent; CREATE TABLE stringcontent( id INT PRIMARY KEY AUTO_INCREMENT, content VARCHAR(20) ); TRUNCATE TABLE stringcontent; DELIMITER $ CREATE PROCEDURE test_randstr_insert(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; #定义一个循环变量i,表示插入次数 DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz'; DECLARE startIndex INT DEFAULT 1; #代表起始索引 DECLARE len INT DEFAULT 1; #代表截取的字符的长度 WHILE i<=insertCount DO SET len = FLOOR(RAND() * MOD(26-startIndex+1,20)+1); #产生一个随机的整数,代表截取长度1至(26-startIndex+1),因为content为20,需要用20取余 SET startIndex = FLOOR(RAND()*26+1); #产生一个随机的整数,代表起始索引1至26 INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len)); SET i = i+1; #循环变量更新 END WHILE; END $ CALL test_randstr_insert(100); SELECT * FROM stringcontent;