MySQL:流程控制

顺序结构:程序从上往下依次执行。
分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
循环结构:程序满足一定条件下,重复执行一组语句。

1 分支结构

1.1 IF函数

功能:实现简单的双分支

语法:

IF(表达式1,表达式2,表达式3)

执行顺序:
如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值。

应用范围:任何地方。

1.2 CASE分支结构

情况1 :类似C++中的switch语句,一般用于实现等值判断。
情况2:类似于C++中的多重if判断语句,一般用于实现区间判断。

语法:
1 CASE结构作为表达式,认为是一条语句,可以应用在任何地方

#情况1
CASE 变量|表达式|字段
	WHEN 要判断的值 THEN 返回的值1
	WHEN 要判断的值 THEN 返回的值2
	...
	ELSE 要返回的值n
END;

#情况2:
CASE 
	WHEN 要判断的条件1 THEN 返回的值1
	WHEN 要判断的条件2 THEN 返回的值2
	...
	ELSE 要返回的值n
END;

2 CASE结构作为独立的语句,认为是一组语句,只能放在BEGIN END中使用

#情况1
CASE 变量|表达式|字段
	WHEN 要判断的值 THEN 语句1; #可以为多条语句
	WHEN 要判断的值 THEN 语句2;
	...
	ELSE 语句n;
END CASE;

#情况2:
CASE 
	WHEN 要判断的条件1 THEN 语句1;  #可以为多条语句
	WHEN 要判断的条件2 THEN 语句2;
	...
	ELSE 语句n;
END CASE;

注:
1 作为表达式时可以嵌套在其他的语句中使用。
2 ELSE可以省略,如果省略了且所有条件或值都没有成立则返回NULL。

示例:

#创建存储过程,根据传入的成绩,显示出等级。
DELIMITER $
CREATE PROCEDURE test_case( IN score INT)
BEGIN
	CASE
		WHEN score>=90 THEN SELECT 'A'; 
		WHEN score>=80 THEN SELECT 'B';
		WHEN score>=60 THEN SELECT 'C';
		ELSE SELECT 'D';
	END CASE;
END $
DELIMITER ;

1.3 IF分支结构

功能:实现多重分支

语法:

if 条件1 then 语句1;
else if 条件2 then 语句2;  #可以为多条语句
...
else 语句n;
end if;

位置: 只能放在begin end中。

示例:

#创建存储过程,根据传入的成绩,显示出等级。
DELIMITER $
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
	IF score>=90 THEN RETURN 'A'; 
	ELSEIF score>=80 THEN RETURN 'B';
	ELSEIF score>=60 THEN RETURN 'C';
	ELSE RETURN 'D';
	END IF;
END $
DELIMITER ;

2 循环结构

语法:
(1)while:先判断后执行

【名称:】while 循环条件 do
		循环体
end while 【名称】;

(2)loop:一般用于实现简单的死循环

【名称:】loop
		循环体
end loop 【名称】;

(3)repeat:先执行后判断,无条件至少执行一次

【名称:】repeat
		循环体
until 结束条件 end repeat 【名称】;

应用位置:
只能放在BEGIN END中

特点:
三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或者iterate),则必须添加名称。 循环可以嵌套。

循环控制语句:
leave:类似于break,用于跳出所在的循环
iterate:类似于continue,用于结束本次循环,继续下一次

示例1:
批量插入,根据次数插入到admin表中多条记录,如果次数大于20则停止。

DROP PROCEDURE IF EXISTS test_while;
DELIMITER $
CREATE PROCEDURE test_while(IN insertCout INT)
BEGIN 
	DECLARE i INT DEFAULT 1;
	a:WHILE i<=insertCount DO
			INSERT INTO admin(username, password) VALUES(CONCAT('xiaohua', i), 88888);
			IF i>=20 THEN LEAVE a;
			END IF;
			SET i = i+1;
	END WHILE a;
END $
DELIMITER ;

CALL test_while(100);

示例2:
创建表stringcontent,其中字段:id自增长,content varchar(20)。
向表中插入指定个数的随机字符串

#建表
DROP TABLE IF EXISTS stringcontent;
CREATE TABLE stringcontent(
		id INT PRIMARY KEY  AUTO_INCREMENT,
		content varchar(20)
);

#创建存储过程
DROP PROCEDURE IF EXISTS randstrInsert;
DELIMITER $
CREATE PROCEDURE randstrInsert(IN insertCount INT)
BEGIN 
	DECLARE i INT DEFAULT 1;  #循环变量,插入次数
	DECLARE j INT DEFAULT 1;  #循环变量,字符串长度
	DECLARE len INT DEFAULT 1;  #随机数,字符串长度
	DECLARE str_sourse VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
	DECLARE str_idx INT;  #随机数,字符位置索引
	DECLARE str_temp VARCHAR(20) DEFAULT '';
	
	WHILE i<=insertCount DO
		SET len = CEIL( RAND() * 20 );  #产生一个1~20的随机整数
		SET j = 1;
		SET str_temp = '';
		REPEAT
			SET str_idx = FLOOR(RAND() * 26 + 1);  #产生一个1~26的随机整数
			SET str_temp = CONCAT(str_temp, SUBSTR(str_sourse, str_idx , 1));
			SET j = j+1;
		UNTIL j > len END REPEAT;  #长度达到len时跳出循环
	#或者使用WHILE
		/*
		WHILE j <= len DO
			SET str_idx = FLOOR(RAND() * 26 + 1);  #产生一个1~26的随机整数
			SET str_temp = CONCAT(str_temp, SUBSTR(str_sourse, str_idx , 1));
			SET j = j+1;		
		END WHILE;
		*/
		INSERT INTO stringcontent(content) VALUES(str_temp);
		SET i = i+1;
		
	END WHILE;
END $
DELIMITER ;

#调用测试
CALL randstrInsert(10);
SELECT * from stringcontent;

#清空表格记录
TRUNCATE stringcontent;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值