流程控制结构
分类:
- 顺序结构(程序从上到下依次执行)
- 分支结构(程序从两条或多条路径中选择一条去执行)
- 循环结构(程序在满足一定条件的基础上,重复执行一段代码)
1 分支结构
1.1 if 函数
功能:实现简单的双分支
语法
if(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,则if函数返回表达式2的值,否则返回表达式2的值。
1.2 case 结构
情况1:类似于Java中的switch语句,ui版用于实现等值判断
语法:
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;
案例
创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩;90-100 ,显示A; 80-90 ,显示 B ;60-80 ,显示 C,否则D.
CREATE PROCEDURE test_case(IN score INT)
BEGIN
CASE
WHEN score>=100 AND score<=100 THEN SELECT 'A';
WHEN score>=80 THEN SELECT 'B';
WHEN score>=60 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END $
CALL test_case(95)$
+---+
| B |
+---+
| B |
+---+
1 row in set (0.00 sec)
1.3 if结构
语法
if 条件1 then 语句1;
elseif 条件2 then 语句2;
…
else 语句n;
end if;
只能用在begin end 中。
mysql> SELECT test_if(86)$CREATE FUNCTION test_if(score INT) RETURNS CHAR
ERROR 1305 (42000): FUNCTION myemployees.test_if does not exist
-> BEGIN
-> IF score>=90 AND score<=100 THEN RETURN 'A';
-> ELSEIF score>=80 THEN RETURN 'B';
-> ELSEIF score>=80 THEN RETURN 'C';
-> ELSE RETURN 'D';
-> END IF;
-> END $
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> SELECT test_if(86)$
+-------------+
| test_if(86) |
+-------------+
| B |
+-------------+
1 row in set (0.00 sec)
2 循环结构
循环控制
itrate 类似于 continue
leave 类似于 break
3.1 while
语法
【标签:】while 循环条件 do
循环体;
end while [标签];
3.2 loop
语法
【标签:】loop
循环体;
end loop [标签] ;
可以用来模拟简单的死循环
3.3 repeat
【标签:】repeat
循环体;
until 结束循环的条件
end repeat [标签] ;
案例
- 批量插入,根据次数嘻哈如到admin 表中多条记录
mysql> use girls$
Database changed
mysql> CREATE PROCEDURE pro_while(IN insertCount INT)
-> BEGIN
-> DECLARE i INT DEFAULT 1;
-> WHILE i<=insertCount DO
-> INSERT INTO admin(`username`,`password`)
-> VALUES (CONCAT('lisi',i),'0000');
-> SET i=i+1;
-> END WHILE;
-> END $
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> CALL pro_while(100) $
Query OK, 1 row affected (0.05 sec)
- 加循环控制 leave
mysql> TRUNCATE TABLE admin$
Query OK, 0 rows affected (0.01 sec)
mysql> DROP PROCEDURE pro_while$
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> CREATE PROCEDURE pro_while(IN insertCount INT)
-> BEGIN
-> DECLARE i INT DEFAULT 1;
-> a:WHILE i<=insertCount DO
-> INSERT INTO admin(`username`,`password`)
-> VALUES (CONCAT('lisi',i),'0000');
-> IF i>=20 THEN LEAVE a;
-> END IF;
-> SET i=i+1;
-> END WHILE a;
-> END $
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> CALL pro_while(100) $
Query OK, 1 row affected (0.02 sec)
mysql> select * from admin$
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | lisi1 | 0000 |
| 2 | lisi2 | 0000 |
| 3 | lisi3 | 0000 |
| 4 | lisi4 | 0000 |
| 5 | lisi5 | 0000 |
| 6 | lisi6 | 0000 |
| 7 | lisi7 | 0000 |
| 8 | lisi8 | 0000 |
| 9 | lisi9 | 0000 |
| 10 | lisi10 | 0000 |
| 11 | lisi11 | 0000 |
| 12 | lisi12 | 0000 |
| 13 | lisi13 | 0000 |
| 14 | lisi14 | 0000 |
| 15 | lisi15 | 0000 |
| 16 | lisi16 | 0000 |
| 17 | lisi17 | 0000 |
| 18 | lisi18 | 0000 |
| 19 | lisi19 | 0000 |
| 20 | lisi20 | 0000 |
+----+----------+----------+
20 rows in set (0.00 sec)
- 加循环控制 itrate
直插入偶数次
mysql> TRUNCATE TABLE admin$
Query OK, 0 rows affected (0.01 sec)
mysql> DROP PROCEDURE pro_while$
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> CREATE PROCEDURE pro_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('lisi',i),'0000');
->
-> END WHILE a;
-> END $
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> CALL pro_while(100) $
Query OK, 1 row affected (0.03 sec)
mysql> select count(*) from admin$
+----------+
| count(*) |
+----------+
| 50 |
+----------+
1 row in set (0.00 sec)
- 已知表 stringcontent
其中字段 id 自增长
content varchar(20)
向该表插入指定个数的随机字符串
mysql> CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
-> BEGIN
-> DECLARE i INT DEFAULT 1;
-> DECLARE str VARCHAR(26) DEFAULT 'abcdefghigklmnopqrstuvwxyz';
-> DECLARE startIndex INT DEFAULT 1; # 代表起始索引
-> DECLARE len INT DEFAULT 1; # 代表截取的字符的长度
-> WHILE i<=insertCount DO
-> SET len=FLOOR(RAND()*(20-startIndex+1)+1); #产生一个随机的整数,代表截取长度
-> SET startIndex=FLOOR(RAND()*26+1); #产生一个随机的整数,代表起始索引
-> INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
-> SET i=i+1;
-> END WHILE;
-> END $
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> CALL test_randstr_insert(10)$
Query OK, 1 row affected (0.01 sec)
mysql> select * from stringcontent$
+----+-----------------+
| id | content |
+----+-----------------+
| 1 | defghigklmnopqr |
| 2 | yz |
| 3 | |
| 4 | v |
| 5 | |
| 6 | yz |
| 7 | |
| 8 | efghigklm |
| 9 | stuv |
| 10 | vw |
+----+-----------------+
10 rows in set (0.00 sec)