with as循环语句_游标番外之循环往复

2ca1ea9c081fe226c0b5ccfe9b3e61a5.png

循环是什么?

在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 列出奇数()//

07c2612876135eb7e8b12fdbb5c78ccc.png

鹦鹉学舌

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()//

1919fe8fa24bdbadccd065285bdd53d7.png

虽然两者返回的结果相同,但不得不说的是,REPEAT(重复)在一些地方比LOOP(循环)更好理解。

cf7b991e9a4fc19b51ba85d85e9bf683.png

相对而言简单一些。

只是当时已惘然

但最简单的还是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 循环测试()//

c02abe0ecb869772161220716db7deaa.png

环中环

循环里面也是可以套循环的,这叫做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 九九乘法表()//

0baaea7dcae6b7d74936be0b0a2c95fe.png

虽然有点复杂,不过还是挺有趣的吧~【手动滑稽

小结

今天我们学了如何利用LOOP、REPEAT和WHILE在MySQL中实现循环,并实际体验了嵌套循环的用法。


希望上文可以帮助大家学习如何在SQL中进行循环操作——若是步骤复杂且需要反复操作的话真的是非常节省时间的一招~如果还是有什么疑问或是建议的话,欢迎留言询问~

祝各位学习愉快!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值