MySQL学习笔记之流程控制结构:分支结构 if.. case..、循环结构loop.. while.. repeat..

前言:流程控制结构

  • 分类: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 $
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值