循环是什么?
在SQL与Python中,一些看似复杂(尤其是枯燥)的问题可以通过循环来解决,比如:
- 在每一行的数字基础上加一;
- 列出1-100中所有的奇数;
- 将三列值按照一定的格式合并成一列;
- 等等。
今天我们就来看看在MySQL中,如何利用代码来实现循环操作。
循环如同游标一样,在MySQL中依赖于储存过程。它主要依靠三种语句实现:
- LOOP(循环);
- REPEAT(重复);
- WHILE(当)。
绕圈圈
LOOP(循环)语句允许我们重复执行相同的一行或多行命令。
在使用时,我们可以选择性地为它命名,再列出需要执行的命令(可以是一行或多行,多行的话需要用结束语句符隔开),最后结束循环:
循环名称: LOOP
命令行1;
命令行2;
END LOOP 循环名称
但是END LOOP并不代表我们从循环语句中退出了。如果单纯使用LOOP-END结构,那程序会无限循环——所以千万不要轻易尝试!
为了从循环中退出,我们可以使用LEAVE(离开)语句:
LEAVE 循环名称;
LOOP也可以与ITERATE(反复)语句一起。利用ITERATE语句可以命令其无视接下来的语句而从循环第一步重新开始:
ITERATE 循环名称;
LOOP举例
假如我们想知道从0-10中的奇数有哪些:
CREATE PROCEDURE 列出奇数() #日常建立个储存过程
BEGIN
DECLARE a INT; #声明一个本地变量a,整数
SET a = 0; #设置a为0
奇数集: LOOP #建立循环,名为奇数集
SET a = a+1; #让a每次增加1
-- 假如a大于或等于10,则退出该循环
IF a>= 10 THEN
LEAVE 奇数集;
-- 如果a没有大于或等于10,那么测试它是否是偶数;
-- 如果是偶数(除二余数为零),则从头开始跑循环
ELSEIF MOD(a, 2) = 0 THEN
ITERATE 奇数集;
END IF; #结束IF语句
SELECT CONCAT(a, " 是一个奇数。")
AS 奇数; #列出结果,重命名为“奇数”
END LOOP 奇数集; #结束循环
END//
接着我们可以使用CALL来查看结果:
CALL 列出奇数()//
鹦鹉学舌
REPEAT(重复)语句与UNTIL(直到)语句也是动辄出双入对。它们可以建立一个“有条件”的循环,当条件被满足时才会停止:
可有可无的名称:REPEAT
命令行;
UNTIL
条件
END REPEAT 可有可无的名称
利用REPEAT(重复)语句建立的循环除非在UNTIL(直到)子句中的判断为真后才会停止。
换而言之,其实如下的LOOP-LEAVE-END循环和REPEAT循环可以达成相同的效果:
循环名称: LOOP
命令行;
IF 条件 THEN
LEAVE 循环名称;
END IF;
END LOOP;
REPEAT举例
如上一个例子中一般,我们来看看0-10中的奇数有哪些:
CREATE PROCEDURE 列出奇数2()
BEGIN
DECLARE b INT;
SET b = 0;
奇数集: REPEAT #注意这里是REPEAT
SET b = b+1;
-- 假如余数不等于0,那么就是奇数,列出结果后继续循环
IF MOD(b,2) <> 0 THEN
SELECT CONCAT(b," is an odd number") AS 奇数;
END IF;
UNTIL b >= 10
END REPEAT;
END//
来看看结果:
CALL 列出奇数2()//
虽然两者返回的结果相同,但不得不说的是,REPEAT(重复)在一些地方比LOOP(循环)更好理解。
相对而言简单一些。
只是当时已惘然
但最简单的还是WHILE语句构成的循环:
循环名称: WHILE 条件 DO
命令行;
END WHILE 循环名称
WHILE举例
假如我们想从0数到5:
CREATE PROCEDURE 循环测试()
BEGIN
DECLARE x INT;
DECLARE lis char(100) DEFAULT '开始';
SET x = 0;
-- 在x大于5之前不停地跑循环:
玩玩WHILE: WHILE x <= 5 DO
Set lis = CONCAT(lis, ', ', x);
Set x = x+1;
END WHILE 玩玩WHILE;
SELECT lis;
END//
检验一下结果:
CALL 循环测试()//
环中环
循环里面也是可以套循环的,这叫做Nested Loops(嵌套循环)。
内外循环举例
假如我们想设置一张自己的九九乘法表:
CREATE PROCEDURE 九九乘法表()
BEGIN
DECLARE i,j INT DEFAULT 1;
DECLARE result, final TEXT DEFAULT '';
-- 外循环开始
被乘数: LOOP
-- 设置内循环,将乘数不断增加1,直到9为止
SET j=1;
乘数: LOOP
SET result = CONCAT(i, "乘", j, "得", i*j, ", ");
SET final = CONCAT(final, result); #将乘数从1到9循环的各结果合并
SET j=j+1;
IF j>9 THEN
LEAVE 乘数;
END IF;
END LOOP 乘数;
-- 内循环结束,被乘数不变的情况下,乘数从1到9循环
-- 强迫症的我将末尾的逗号改成分号,
-- 去掉末尾的逗号:TRIM【消减】(TRAILING【末尾】 ', ' FROM final)
SELECT CONCAT(TRIM(TRAILING ', ' FROM final), ";")
AS 乘法表;
-- 继续外循环,被乘数不断加1,直到9为止
SET final = '';
SET i=i+1;
IF i>9 THEN
LEAVE 被乘数;
END IF;
END LOOP 被乘数;
-- 外循环结束
END//
来看看我们高大上的乘法表:
CALL 九九乘法表()//
虽然有点复杂,不过还是挺有趣的吧~【手动滑稽
小结
今天我们学了如何利用LOOP、REPEAT和WHILE在MySQL中实现循环,并实际体验了嵌套循环的用法。
希望上文可以帮助大家学习如何在SQL中进行循环操作——若是步骤复杂且需要反复操作的话真的是非常节省时间的一招~如果还是有什么疑问或是建议的话,欢迎留言询问~
祝各位学习愉快!