学习目标

1.掌握while循环语句的使用

2.掌握repeat循环语句的使用

3.掌握loop循环语句的使用

4.能使用循环结构编写程序

学习导航:

画板

一、WHILE语句

MySQL中循环语句可以在函数、存储过程或者触发器等内容中使用。 语法: [开始标签:] WHILE 条件表达式 DO 语句块; END WHILE [结束标签]; 实例1:使用WHILE语句,求1到100的和。 sql DROP PROCEDURE IF EXISTS proc_sum; -- 求1到100的和。 CREATE PROCEDURE proc_sum() BEGIN -- 加数i = 0,累加器sum = 0 DECLARE i,sum INT DEFAULT 0; -- 重复多次 sum = sum +i,刷新i WHILE i<=100 DO SET sum = sum+i; SET i = i+1; END WHILE; -- 查询结果 SELECT sum; END; sql DROP PROCEDURE IF EXISTS proc_sum; -- 求1到100的和。 CREATE PROCEDURE proc_sum() BEGIN -- 加数i = 0,累加器sum = 0 DECLARE i,sum INT DEFAULT 0; -- 重复多次 sum = sum +i,刷新i label:WHILE i<=100 DO SET sum = sum+i; SET i = i+1; IF sum >=2000 THEN LEAVE label; END IF; END WHILE; -- 查询结果 SELECT i-1,sum; END; 实例2:创建meitao.ordersCopy,给该表添加10000行测试数据。 sql -- 实例2:创建meitao.ordersCopy,给该表添加10000行测试数据。 -- 删除 DROP PROCEDURE IF EXISTS proc_orders; -- 创建 CREATE PROCEDURE proc_orders() COMMENT '创建meitao.ordersCopy,给该表添加10000行测试数据。' BEGIN -- 过程体 DECLARE customer_ID int; DECLARE orders_Date,delivery_Date datetime; DECLARE rows int DEFAULT 10000; #循环控制变量rows -- 使用repeat循环,条件10000行 -- SET FOREIGN_key_checks = 0; REPEAT -- 循环体 SET customer_ID = TRUNCATE(RAND()*10 ,0 )+1; # 1-10的整数 SELECT customer_ID; SET orders_Date = NOW(),delivery_Date=DATE_ADD(NOW(),INTERVAL 30 MINUTE); -- 添加一行 insert orders_copy(customerID,ordersDate,deliveryDate) SELECT customer_ID,orders_Date,delivery_Date; -- rows减一 set rows = rows - 1; UNTIL rows = 0 # 直到条件为真不做了,退出循环 END repeat; end; ## 二、repeat语句 语法: [开始标签:]REPEAT 语句块; UNTIL 条件表达式

END REPEAT [结束标签];

应用练习:使用repeat语句实现以上功能。

  1. -- 实例2:创建meitao.ordersCopy,给该表添加10000行测试数据。
  2. -- 删除
  3. DROP PROCEDURE IF EXISTS proc_orders;
  4. -- 创建
  5. CREATE PROCEDURE proc_orders()
  6. COMMENT '创建meitao.ordersCopy,给该表添加10000行测试数据。'
  7. BEGIN
  8. -- 过程体
  9. DECLARE customer_ID int;
  10. DECLARE orders_Date,delivery_Date datetime;
  11. DECLARE rows int DEFAULT 10000; #循环控制变量rows
  12. -- 使用repeat循环,条件10000
  13. -- SET FOREIGN_key_checks = 0;
  14. REPEAT
  15. -- 循环体
  16. SET customer_ID = TRUNCATE(RAND()*10 ,0 )+1; # 1-10的整数
  17. SELECT customer_ID;
  18. SET orders_Date = NOW(),delivery_Date=DATE_ADD(NOW(),INTERVAL 30 MINUTE);
  19. -- 添加一行
  20. insert orders_copy(customerID,ordersDate,deliveryDate)
  21. SELECT customer_ID,orders_Date,delivery_Date;
  22. -- rows减一
  23. set rows = rows - 1;
  24. UNTIL rows = 0 # 直到条件为真不做了,退出循环
  25. END repeat;
  26. end;

学习提示:REPEAT语句是在执行循环体里的语句块后再执行“条件表达式”的比较,不管条件是否满足,循环体至少执行一次;而WHILE语句则是先执行“条件表达式”的比较,当结果为TRUE时再执行循环体中的语句块。

三、loop语句

语法:

[开始标签:] LOOP 语句块

END LOOP [结束标签];

四、其他流程控制语句

1.LEAVE语句

LEAVE语句主要用于跳出循环控制,与高级语言中的BREAK语句相似 语法:leave 标签名;

应用练习:使用loop语句实现以上功能。

2.ITERATE语句

ITERATE语句也可用于跳出循环,与高级语言中的CONTINUE语句相似。 语法:iterate 标签名; 应用练习:

学习提示:LEAVE语句和ITERATE语句都是用来跳出循环语句,但两者的功能是不一样的。LEAVE语句是跳出整个循环,然后执行循环外的程序语句;ITERATE语句是跳出本次循环,进入下一次循环。

五、应用

模拟下单

  1. DROP PROCEDURE if EXISTS proc_xiadan;
  2. CREATE PROCEDURE proc_xiadan(n int)
  3. BEGIN
  4. -- 1声明局部变量cID,odDate,deDate
  5. DECLARE cid int; -- cid下单用户id
  6. DECLARE odDate,deDate datetime; -- 下单时间和送达时间
  7. repeat
  8. -- 2 给表orders_copy添加数据
  9. -- 2.1 先给变量赋值
  10. SET cid = TRUNCATE((RAND()*10),0)+1;
  11. SET odDate = CURRENT_TIMESTAMP();
  12. SET deDate = ADDDATE(CURRENT_TIMESTAMP(),1);
  13. -- 2.2 将变量值添加到表中
  14. INSERT INTO orders_copy(customerID,ordersDate,deliveryDate)
  15. SELECT cid,odDate,deDate;
  16. -- 2.3 循环控制变量n-1
  17. SET n = n-1;
  18. UNTIL n=0
  19. END REPEAT;
  20. end;
  21. -- 调用proc_xiadan模拟下10个订单
  22. CALL proc_xiadan(10);

六、课堂小结

1.MySQL的控制语句的共同特点:

关键字开头 end 关键字结束

2.MySQL的流控语句必须在代码块中使用

3.如果函数体由多条语句组成,必须用begin ……end

4.MySQL的循环结构中没有for循环