前言:流程控制结构
分类
:MySQL中的流程控制结构可分为3类如下:
1.顺序结构:就是按照顺序正常执行下去
2.分支结构:if、case等
3.循环结构:loop、while、repeat等
一、分支结构
1.1 IF函数
语法:
IF(expr1,expr2,expr3)
执行:如果expr1成立,执行expr2,否则执行expr3
1.2 CASE结构
1.2.1实现switch CASE 功能
语法:
CASE 变量|表达式|字段
WHEN 要判断的值1 THEN 返回的值1
WHEN 要判断的值2 THEN 返回的值2
...
ELSE 要返回的值n
END
1.2.2实现多重 IF
语法:
CASE
WHEN 表达式1 THEN 返回的值1
WHEN 表达式2 THEN 返回的值2
...
ELSE 要返回的值n
END
以上的CASE是作为表达式使用,表达式的结果是个值
1.2.3 实现 switch CASE 但以语句的形式存在,作为语句只能放在BEGIN END中
语法:
CASE 变量|表达式|字段
WHEN 要判断的值1 THEN 语句1;
WHEN 要判断的值2 THEN 语句2;
...
ELSE 语句n;
END CASE;
1.2.4 实现多重 IF 但以语句的形式存在
语法:
CASE
WHEN 表达式1 THEN 语句1;
WHEN 表达式2 THEN 语句2;
...
ELSE 语句n;
END CASE;
特点:
1、CASE
结构作为独立语句时,只能放在BEGIN END
中
2、ELSE
可以省略,但是不建议省略,默认是ELSE NULL
3、WHEN
中的条件满足,则执行THEN
后的语句,执行完结束,都不满足执行ELSE
后的语句
案例
:把case语句作为语句使用,创建存储过程,实现根据传入的成绩给成绩打分
CREATE PROCEDURE testp1(IN scores INT)
BEGIN
CASE
WHEN scores >= 90 AND scores <= 100 THEN SELECT 'A';
WHEN scores >= 80 THEN SELECT 'B';
WHEN scores >= 60 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE; #end case 不能缺少
END $
CALL testp1(89) $
1.3 if结构(1.1是IF函数,注意区分)
- 功能:实现多重分支,仅能用在BEGIN END中
- 语法:(可以说是最像高级语言的IF结构)
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
ELSE 语句n;
END IF;
案例
:创建一个函数,根据传入的成绩,返回一个成绩等级,应用到if 结构
CREATE FUNCTION testf1(scores INT) RETURNS CHAR(1)
BEGIN
IF scores >= 90 AND scores <= 100 THEN RETURN 'A';
ELSEIF scores >= 80 THEN RETURN 'B';
ELSEIF scores >= 60 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END $
SELECT testf1(90) $
二、循环结构 必须放在begin end里面
分类:
while
loop
continue
循环控制:
iterate
:类似于continue
结束本次循环,继续下次循环leave
: 类似于break
结束当前的循环结构
2.1 while
语法:
[label:] WHILE 循环条件
DO
循环体;
END WHILE [label];
-- label 是自己指定的某个标签名,标签结合iterate或leave控制循环的走向
2.2 loop
语法:
[label:] LOOP
循环体;
END LOOP [label];
loop
可以用来模拟死循环
2.3 repeat
(类似DO{} WHILE() 至少执行一次)
语法:
[label:] REPEAT
循环体;
UNTIL 结束循环的条件
END REPEAT [label ];
注意:标签主要用在循环控制条件上!!!
案例
1:实现批量插入,根据输入参数次数来插入到admin表中多条记录
CREATE PROCEDURE test_while(IN times INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<times
DO
INSERT INTO admin(username,PASSWORD) VALUES('dzc','0000');
SET i = i + 1;
END WHILE;
END $
CALL test_while(10)$
案例
2:使用leave,实现批量插入。当次数超过5时结束。
CREATE PROCEDURE test_while2(IN times INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<times
DO
INSERT INTO admin(username,PASSWORD) VALUES('dzc','0000');
SET i = i + 1;
IF i>=5
THEN LEAVE a;
END IF;
END WHILE a;
END $
CALL test_while2(10)$
案例
3:使用iterate,仅仅插入偶数编号的用户和密码
TRUNCATE TABLE admin$
CREATE PROCEDURE test_iterate(IN times INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i <= times
DO --#别忘了do...
SET i = i + 1;
IF MOD(i,2) <> 0
THEN ITERATE a;
END IF;
INSERT INTO admin(id, username, PASSWORD)
VALUES(i, CONCAT('user',i),'0000');
END WHILE a;
END $
CALL test_iterate(10)$
三、一个综合性的练习
要求:
- 1.创建一个表stringcontent其中有自增长字段 id、content varchar(20)
- 2.并创建过程或函数,向表中插入指定个数、随机的字符串
DROP TABLE IF EXISTS stringcontent$
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
) $
DROP PROCEDURE IF EXISTS mytestproc $
CREATE PROCEDURE mytestproc(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE defaultContent VARCHAR(26) DEFAULT 'abcdefghijklmnobqrstuvwxyz';
DECLARE startindex INT DEFAULT 1;
DECLARE len INT DEFAULT 1;
WHILE i<num DO
SET i = i + 1;
SET startindex = FLOOR(RAND()*27);
SET len = ABS(20-(FLOOR((RAND() * (27 - startindex))+ 1)));
INSERT INTO stringcontent VALUES(
NULL,
SUBSTR(defaultContent, startindex, len));
END WHILE;
END $
CALL mytestproc(10) $
SELECT * FROM stringContent $