学习目标:
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语句实现以上功能。
-- 实例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语句是在执行循环体里的语句块后再执行“条件表达式”的比较,不管条件是否满足,循环体至少执行一次;而WHILE语句则是先执行“条件表达式”的比较,当结果为TRUE时再执行循环体中的语句块。
三、loop语句
语法:
[开始标签:] LOOP 语句块END LOOP [结束标签];
四、其他流程控制语句
1.LEAVE语句
LEAVE语句主要用于跳出循环控制,与高级语言中的BREAK语句相似 语法:leave 标签名;应用练习:使用loop语句实现以上功能。
2.ITERATE语句
ITERATE语句也可用于跳出循环,与高级语言中的CONTINUE语句相似。 语法:iterate 标签名; 应用练习:学习提示:LEAVE语句和ITERATE语句都是用来跳出循环语句,但两者的功能是不一样的。LEAVE语句是跳出整个循环,然后执行循环外的程序语句;ITERATE语句是跳出本次循环,进入下一次循环。
五、应用
模拟下单
DROP PROCEDURE if EXISTS proc_xiadan;
CREATE PROCEDURE proc_xiadan(n int)
BEGIN
-- 1声明局部变量cID,odDate,deDate
DECLARE cid int; -- cid下单用户id
DECLARE odDate,deDate datetime; -- 下单时间和送达时间
repeat
-- 2 给表orders_copy添加数据
-- 2.1 先给变量赋值
SET cid = TRUNCATE((RAND()*10),0)+1;
SET odDate = CURRENT_TIMESTAMP();
SET deDate = ADDDATE(CURRENT_TIMESTAMP(),1);
-- 2.2 将变量值添加到表中
INSERT INTO orders_copy(customerID,ordersDate,deliveryDate)
SELECT cid,odDate,deDate;
-- 2.3 循环控制变量n-1
SET n = n-1;
UNTIL n=0
END REPEAT;
end;
-- 调用proc_xiadan模拟下10个订单
CALL proc_xiadan(10);
六、课堂小结
1.MySQL的控制语句的共同特点:
关键字开头 end 关键字结束
2.MySQL的流控语句必须在代码块中使用
3.如果函数体由多条语句组成,必须用begin ……end
4.MySQL的循环结构中没有for循环