流程控制结构
顺序、分支、循环

一、分支结构

1.1 if函数

语法:if(条件,值1,值2)
功能:实现双分支
应用在begin end中或外面

1.2 case结构

语法:
情况1:类似于switch

  1. case 变量或表达式
  2. when 1 then 语句1;
  3. when 2 then 语句2;
  4. ...
  5. else 语句n;
  6. end


情况2:

  1. case
  2. when 条件1 then 语句1;
  3. when 条件2 then 语句2;
  4. ...
  5. else 语句n;
  6. end


作为表达式:应用在begin end 中或外面
作为独立的语句:只能再begin end 中

1.3 if结构


语法:

  1. if 条件1 then 语句1;
  2. elseif 条件2 then 语句2;
  3. ....
  4. else 语句n;
  5. end if;

功能:类似于多重if

只能应用在begin end 中

案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

  1. CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
  2. BEGIN
  3. DECLARE ch CHAR DEFAULT 'A';
  4. IF score>90 THEN SET ch='A';
  5. ELSEIF score>80 THEN SET ch='B';
  6. ELSEIF score>60 THEN SET ch='C';
  7. ELSE SET ch='D';
  8. END IF;
  9. RETURN ch;
  10. END $
  11. SELECT test_if(87)$


案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500

  1. CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
  2. BEGIN
  3. IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
  4. ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
  5. ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
  6. END IF;
  7. END $
  8. CALL test_if_pro(2100)$



案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

  1. CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
  2. BEGIN
  3. DECLARE ch CHAR DEFAULT 'A';
  4. CASE
  5. WHEN score>90 THEN SET ch='A';
  6. WHEN score>80 THEN SET ch='B';
  7. WHEN score>60 THEN SET ch='C';
  8. ELSE SET ch='D';
  9. END CASE;
  10. RETURN ch;
  11. END $
  12. SELECT test_case(56)$

二、循环结构

分类:

while、loop、repeat
image.png

循环控制:

iterate类似于 continue,继续,结束本次循环,继续下一次
leave 类似于 break,跳出,结束当前所在的循环

2.1 while

语法:

  1. 【标签:】while 循环条件 do
  2. 循环体;
  3. end while 标签】;

联想:

  1. while(循环条件){
  2. 循环体;
  3. }

2.2 loop

语法:

  1. 【标签:】loop
  2. 循环体;
  3. end loop 【标签】;

可以用来模拟简单的死循环

2.3 repeat

语法:

  1. 【标签:】repeat
  2. 循环体;
  3. until 结束循环的条件
  4. end repeat 【标签】;

1.没有添加循环控制语句

#案例:批量插入,根据次数插入到admin表中多条记录

  1. DROP PROCEDURE pro_while1$
  2. CREATE PROCEDURE pro_while1(IN insertCount INT)
  3. BEGIN
  4. DECLARE i INT DEFAULT 1;
  5. WHILE i<=insertCount DO
  6. INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
  7. SET i=i+1;
  8. END WHILE;
  9. END $
  10. CALL pro_while1(100)$

java的循环

  1. int i=1;
  2. while(i<=insertcount){
  3. //插入
  4. i++;
  5. }

2.添加leave语句

#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止

  1. TRUNCATE TABLE admin$
  2. DROP PROCEDURE test_while1$
  3. CREATE PROCEDURE test_while1(IN insertCount INT)
  4. BEGIN
  5. DECLARE i INT DEFAULT 1;
  6. a:WHILE i<=insertCount DO
  7. INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
  8. IF i>=20 THEN LEAVE a;
  9. END IF;
  10. SET i=i+1;
  11. END WHILE a;
  12. END $
  13. CALL test_while1(100)$


3.添加iterate语句

#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次

  1. TRUNCATE TABLE admin$
  2. DROP PROCEDURE test_while1$
  3. CREATE PROCEDURE test_while1(IN insertCount INT)
  4. BEGIN
  5. DECLARE i INT DEFAULT 0;
  6. a:WHILE i<=insertCount DO
  7. SET i=i+1;
  8. IF MOD(i,2)!=0 THEN ITERATE a;
  9. END IF;
  10. INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
  11. END WHILE a;
  12. END $
  13. CALL test_while1(100)$
  1. int i=0;
  2. while(i<=insertCount){
  3. i++;
  4. if(i%2==0){
  5. continue;
  6. }
  7. 插入
  8. }

三、案例 已知表stringcontent 其中字段:
id 自增长
content varchar(20)
向该表插入指定个数的,随机的字符串

  1. DROP TABLE IF EXISTS stringcontent;
  2. CREATE TABLE stringcontent(
  3. id INT PRIMARY KEY AUTO_INCREMENT,
  4. content VARCHAR(20)
  5. );
  6. DELIMITER $
  7. CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
  8. BEGIN
  9. DECLARE i INT DEFAULT 1;
  10. DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
  11. DECLARE startIndex INT;#代表初始索引
  12. DECLARE len INT;#代表截取的字符长度
  13. WHILE i<=insertcount DO
  14. SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26
  15. SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-(20-startIndex+1
  16. INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
  17. SET i=i+1;
  18. END WHILE;
  19. END $
  20. CALL test_randstr_insert(10)$
  • RAND() 随机数生成函数,随机生成(0,1)
  • FLOOR
  • SUBSTR(str,startIndex,len) 截取字符串函数