系统整理Mysql学习笔记——流程控制结构

前言

流程控制结构是任何一个语言的一种基本具备的特性,有三种结构,分别是顺序结构、分支结构、循环结构,下面主要是对分支结构和循环结构进行了解。

一、分支结构

在MYSQL中分支结构可以看成有三种 ,分别是IF函数、CASE结构、IF结构

1 IF函数

IF函数,它首先是一个函数,所以它可以在函数所支持的位置使用,主要是针对简单的双分支结构。
语法:

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

如果表达式1为TRUE,则执行返回表达式2的值,否则返回表达式3的值。
例子:

SELECT IF(TRUE,'我是TRUE','我是FALSE') AS LABEL;

2 CASE结构

CASE结构分为两种情况,第一种就是类似于JAVA中的SWITCH语句,用于实现等值判断;第二种类似于JAVA中的多重IF语句,用于实现区间判断。

2.1 等值判断

语法:

CASE 变量|表达式|字段
WHEN 判断的值 THEN 返回的值
WHEN 判断的值2 THEN 返回的值2
...
ELSE 默认返回值n
END

上面这种是表达式的情况,也就是CASE整个相当于一个表达式,它可以放到表达式允许放置的位置。
它除了可以作为一个表达式以外,它还可以作为一个语句来使用,不过如果是作为一个语句的话,那么它只能放到BEGIN END

CASE 变量|表达式|字段
WHEN 判断的值 THEN 语句1;
WHEN 判断的值2 THEN 语句2;
...
ELSE 语句N;
END CASE;

例子:

# 将CASE结构看成是一个语句去执行
DROP PROCEDURE IF EXISTS case_sim;
DELIMITER $$
CREATE PROCEDURE case_sim(IN `name` CHAR(20))
BEGIN
	CASE `name`
	WHEN '小红' THEN SELECT '我是小红,我在大学' AS label;
	WHEN '小绿' THEN SELECT '我是小绿,我在中学' AS label;
	WHEN '小黑' THEN SELECT '我在小黑,我在中专' AS label;
	ELSE SELECT '我就是我,不一样的烟火';
	END CASE;
END$$
CALL case_sim('小红')$$
#====================================================================================
# 将CASE结构看成是一个公式
DROP FUNCTION IF EXISTS case_sim2;
DELIMITER $$
CREATE FUNCTION case_sim2(`name` CHAR(20)) RETURNS CHAR(40) DETERMINISTIC
BEGIN
	DECLARE re CHAR(40) DEFAULT '';
	SET re := CASE `name`
						WHEN '小红' THEN '我是小红,我在大学'
						WHEN '小绿' THEN '我是小绿,我在中学'
						WHEN '小黑' THEN '我在小黑,我在中专'
						ELSE '我就是我,不一样的烟火'
						END;
	RETURN re;
END$$
SELECT case_sim2('')$$
2.2 区间判断
CASE 
THEN 判断的条件1 THEN 返回的值1
THEN 判断的条件2 THEN 返回的值2
...
ELSE 返回的值N
END

和上面类似

CASE 
THEN 判断的条件1 THEN 语句1;
THEN 判断的条件2 THEN 语句2;
...
ELSE 语句N;
END CASE;

例子:

# 将CASE结构看成是一个语句去执行
DROP PROCEDURE IF EXISTS case_sim; # 删除已存在的存储过程
DELIMITER $$
CREATE PROCEDURE case_sim(IN count INT) # 创建存储过程
BEGIN
	CASE
	WHEN count BETWEEN 90 AND 100 THEN SELECT '优';
	WHEN count BETWEEN 70 AND 90 THEN SELECT '良';
	WHEN count BETWEEN 60 AND 70 THEN SELECT '及格';
	ELSE SELECT '不及格';
	END CASE;
END$$
CALL case_sim(90)$$
#============================================================
# 将CASE结构看成是一个公式
DROP FUNCTION IF EXISTS case_sim2;
DELIMITER $$
CREATE FUNCTION case_sim2(count INT) RETURNS CHAR(4) DETERMINISTIC # 以DETERMINISTIC方式创建一个函数
BEGIN
	DECLARE re CHAR(4) DEFAULT '';
	SET re := CASE
						WHEN count BETWEEN 90 AND 100 THEN '优'
						WHEN count BETWEEN 70 AND 90 THEN '良'
						WHEN count BETWEEN 60 AND 70 THEN '及格'
						ELSE '不及格'
						END;   # 将CASE表达式的结果存储在局部变量re中
	RETURN re;
END$$
SELECT case_sim2(65)$$

3 IF结构

IF结构和上面的IF函数就很像了,但是不同的是它不是函数,它只可以在BEGIN END中使用,并且它比IF函数的功能要更加强大一些,它实现了多重分支,类似于JAVA中的IF分支结构。
语法:

IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
ELSE 语句N;
END IF;

例子:

DROP PROCEDURE IF EXISTS case_sim;
DELIMITER $$
CREATE PROCEDURE case_sim(IN `name` CHAR(20))
BEGIN
	# IF 判断
	IF `name` = '小红' THEN SELECT '我是小红,我在大学' AS label;
	ELSEIF `name` = '小绿' THEN SELECT '我是小绿,我在中学' AS label;
	ELSEIF `name` = '小黑' THEN SELECT '我在小黑,我在中专' AS label;
	ELSE SELECT '我就是我,不一样的烟火';
	END IF;
END$$
CALL case_sim('小红')$$

二、循环结构

在MYSQL中循环结构分为WHILELOOPREPEAT
和JAVA类似,循环控制也分为两种,这个详细介绍一下

  • ITERATE:迭代、重复(直译),类似于JAVA中的CONTINUE,结束本次循环,继续下一次循环;
  • LEAVE:离开(直译),类似于JAVA中的BREAK,跳出当前所在的循环,不再进行循环。

1 WHILE循环

语法:

[标签:] WHILE 循环条件 DO
		循环体;
END WHILE[ 标签];

例子:

# 删除可能存在的存储结构
DROP PROCEDURE IF EXISTS while_control;
# 清空表中数据,用来测试插入情况
TRUNCATE TABLE `grade_new_9`;
DELIMITER $$ # 定义结束符
CREATE PROCEDURE while_control(IN count INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  # WHILE循环,插入记录
	WHILE i<count DO
		INSERT INTO `grade_new_9` (`id`,`seat`,`age`) VALUES(1000+i,1000+i,1000+i);
		# 循环控制变量
		SET i:=i+1;
	END WHILE;
END$$
CALL while_control(100)$$

WHILE循环是目前使用比较频繁的循环结构,是先判断后执行的,这里没有使用标签,所以也不能使用循环控制。

2 LOOP循环

语法:

[标签:] LOOP
		循环体;
END LOOP [标签];

例子:

# 删除存在的函数
DROP FUNCTION IF EXISTS take_sum_odd;
DELIMITER $$
# 计算从1到指定数字的所有奇数和
CREATE FUNCTION take_sum_odd(num INT) RETURNS INT NO SQL
BEGIN
	DECLARE re INT DEFAULT 0;
	DECLARE i INT DEFAULT 0;
	takeSumOdd: LOOP
	  	SET i:=i+1;
	  	# 当大于指定数字,则跳出循环
		IF i>num THEN
			LEAVE takeSumOdd; 
		END IF; 
		# 对奇数进行累加
		SET re:=re+IF(MOD(i,2)=1,i,0);
	END LOOP takeSumOdd;
	RETURN re;
END $$
SELECT take_sum_odd(10) AS oddSum $$

这里因为LOOP是一个无结束循环条件的一个循环,所以必须使用循环控制语句来对循环进行控制,否则它就是一个死循环。这里使用了循环控制LEAVE 标签,这个就是跳出循环,takeSumOdd就是这个LOOP循环的标签,其实也可以看成它就是这个循环本身,LEAVE 标签的意思就是离开这个循环,因此如果要使用循环控制LEAVEITERATE的话,就必须使用标签来表示这个循环才可以。

3 REPEAT循环

语法:

[标签:] REPEAT
		循环体;
UNTIL 结束循环体条件
END REPEAT [标签];

例子:

# 删除存在的函数
DROP FUNCTION IF EXISTS take_sum_odd;
DELIMITER $$
# 计算从1到指定数字的所有奇数和
CREATE FUNCTION take_sum_odd(num INT) RETURNS INT NO SQL
BEGIN
	DECLARE re INT DEFAULT 0;
	DECLARE i INT DEFAULT 0;
	takeSumOdd: REPEAT
	  	SET i:=i+1;
	  	# 奇数,累加
		IF MOD(i,2)=1 THEN
			SET re:=re+i;
			ITERATE takeSumOdd; 
		END IF; 
	UNTIL i>=num # 表达式为真时,结束循环
	END REPEAT takeSumOdd;
	RETURN re;
END $$
SELECT take_sum_odd(10) AS oddSum $$

REPEATE循环和其他两个循环不太一样,它和JAVA中的DO WHILE很像,都是先执行后判断,不过这里UNTIL所表达的意思是,直到UNTIL后面表达式为TRUE时结束循环。

结语

至此MYSQL的流程控制结构的基本语法就是上面这部分了,这部分内容应该属于PLSQL,有兴趣可以看一看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值