流程控制结构有三种,顺序结构、分支结构、循环结构。
顺序结构:程序从下往下依次执行。分支结构:程序从两条或多条路径中选择一条来执行。循环结构:程序满足一定条件下,重复执行一段代码。
本文整理MySQL循环结构相关内容。
什么是MySQL的循环结构
分类
三种:while、loop、repeat
循环控制
iterate: 类似于java中的continue,继续,即结束当前循环,继续下一次。
leave:类似于java中的break,跳出,结束当前所在的循环。
语法
wile
【标签:】while 循环的条件 do 循环体;end while 【标签】
标签相当于给循环起一个名字,这样可以搭配循环控制使用,是可选的,没有就是一个普通的循环。
loop
【标签:】loop循环体;end loop 【标签】
loop没有循环条件,可以模拟简单的死循环,想要中途跳出可以使用leave。
repeat
【标签:】 repeat循环体;until 结束循环的条件end repeat【标签】
repeat有点类似do while,肯定会执行一次循环体。
以while循环做些实例,只要掌握了while循环的使用,那么其他的也相差无几。
一、无循环控制
先建一张user表用于测试,字段id是主键,并且自增,还有有name和password字段。
CREATE TABLE user ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`))
一个简单的问题,根据传入的次数向user表插入多条记录。
我们可以选择额头存储过程或者函数,因为问题没有涉及到返回值,所以选择写一个存储过程。
在java,while循环我们可以这么做:
int i = 0;while(i < n){ …… i++;}
到MySQL中也是同样思路
delimiter &create PROCEDURE p1(in n int)BEGIN DECLARE i int default 1;#定义i变量,默认值1 while i <= n DO insert into user(name,password) VALUES (CONCAT('john',i),'123456'); set i = i+1;#i++ end while;end &
例中while循环也可以加上名字,不过没有使用到循环控制,所以名字有没有也无所谓。插入name和password,name用单词john拼接了i,方便查看。测试简单点,插入10条数据
mysql> call p1(10)&Query OK, 1 row affected (0.43 sec)
看一下user表数据
![8d1ff8b40720349c6452eceea89c5d07.png](https://img-blog.csdnimg.cn/img_convert/8d1ff8b40720349c6452eceea89c5d07.png)
已经插入了10条语句。
二、使用leave
用上面的例子改变一下,当次数大于20的时候停止循环。
delete from user&create PROCEDURE p2(in n int)BEGIN DECLARE i int default 1;#定义i变量,默认值1 a:while i <= n DO #判断 if i > 20 then leave a; end if; #插入 insert into user(name,password) VALUES (CONCAT('john',i),'123456'); #i++ set i = i+1; end while a;end &
先把表数据都删除。创建存储过程p2,在插入之前判断次数是否大于20次,用到了if结构,而且使用leave跳出循环,此时要加循环加上标签也就是名字。
传入100测试
mysql> call p2(100)&Query OK, 1 row affected (0.84 sec)
看一下表中现在有多少条数据。
![18dcf73fe8e93086c10f33607218c219.png](https://img-blog.csdnimg.cn/img_convert/18dcf73fe8e93086c10f33607218c219.png)
一共只有20条数据,那么说明判断是有效果的。
三、使用iterate
问题再改一下,这次只插入偶数次的记录。
java判断偶数可以这样:i%2==0,而MySQL中可以使用MOD函数。看一下存储过程写法
create PROCEDURE p3(in n int)BEGIN DECLARE i int default 0;#定义i变量,默认值1 a:while i <= n DO set i = i+1;#i++ if mod(i,2) !=0 then ITERATE a; end if; insert into user(name,password) VALUES (CONCAT('john',i),'123456'); end while a;end &
这次变量 i 的默认值改为0,i 要先自增,再判断它是否是偶数,mod函数值不等于0则说明不是偶数,结束当前循环,即不能执行插入语句。
传入100测试一下,测试前先把数据都删除。
delete from user&mysql> call p3(100)&Query OK, 1 row affected (1.86 sec)
查看一下数据
![d22ed739a073760dd3fd3f364270f208.png](https://img-blog.csdnimg.cn/img_convert/d22ed739a073760dd3fd3f364270f208.png)
一共50条数据,从name的值可以看到,插入的都是偶数。
好了,关于循环就到此,了解了一下怎么使用。使用while从无循环控制,到使用leave和iterate循环控制都简单地举了例子,这些问题使用其他两个循环结构也可以完成,可以自己测试一下。