前言
流程控制结构是任何一个语言的一种基本具备的特性,有三种结构,分别是顺序结构、分支结构、循环结构,下面主要是对分支结构和循环结构进行了解。
一、分支结构
在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中循环结构分为WHILE
、LOOP
、REPEAT
和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 标签
的意思就是离开这个循环,因此如果要使用循环控制LEAVE
、ITERATE
的话,就必须使用标签来表示这个循环才可以。
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,有兴趣可以看一看。