MySQL基础-20 流程控制结构

流程控制结构

分类:

  • 顺序结构(程序从上到下依次执行)
  • 分支结构(程序从两条或多条路径中选择一条去执行)
  • 循环结构(程序在满足一定条件的基础上,重复执行一段代码)

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 [标签] ;

案例

  1. 批量插入,根据次数嘻哈如到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)
  1. 加循环控制 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)
  1. 加循环控制 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)

  1. 已知表 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值