MySQL,作为一种广泛使用的关系型数据库管理系统,同样提供了多种循环机制来满足不同场景的需求
了解并熟练运用这些循环结构,不仅能提升SQL脚本的灵活性和效率,还能简化复杂数据处理流程
本文将深入探讨MySQL中的几种主要循环结构——WHILE循环、REPEAT循环和LOOP循环,并通过实例展示它们的应用实践
一、WHILE循环:条件驱动的循环艺术 WHILE循环是MySQL中最直观的一种循环结构,它基于一个布尔表达式来决定是否继续执行循环体内的语句
只要条件为真(TRUE),循环就会持续执行,直到条件变为假(FALSE)时终止
语法结构: sql 【label:】 WHILE condition DO -- 循环体语句 END WHILE【label】; 其中,`label`是可选的标签,用于在复杂的嵌套循环中标识特定的循环,便于后续跳出(LEAVE)或继续(ITERATE)操作
`condition`是一个返回布尔值的表达式,决定了循环是否继续
示例应用: 假设我们有一个名为`employees`的表,记录了员工的ID、姓名和工资
现在我们想要给每位工资低于5000的员工加薪10%,直到没有符合条件的员工为止
sql DELIMITER // CREATE PROCEDURE increase_salary() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE emp_id INT; DECLARE emp_salary DECIMAL(10,2); --声明游标 DECLARE cur CURSOR FOR SELECT id, salary FROM employees WHERE salary <5000; --声明处理结束时的操作 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO emp_id, emp_salary; IF done THEN LEAVE read_loop; END IF; -- 更新工资 UPDATE employees SET salary = salary1.10 WHERE id = emp_id; END LOOP; CLOSE cur; END // DELIMITER ; 虽然上述示例使用了LOOP循环结构来实现整体流程控制,但在实际应用中,WHILE循环可以直接用于检查条件并执行相应操作,如下例所示: sql DELIMITER // CREATE PROCEDURE increase_salary_while() BEGIN DECLARE emp_count INT DEFAULT1; --假设至少有一个员工 WHILE emp_count >0 DO START TRANSACTION; -- 更新工资并获取受影响的行数 UPDATE employees SET salary = salary1.10 WHERE salary < 5000; SET emp_count = ROW_COUNT(); -- ROW_COUNT()返回上一语句影响的行数 COMMIT; END WHILE; END // DELIMITER ; 注意:直接使用WHILE循环进行此类操作可能不是最高效的方式,特别是在处理大量数据时,因为每次循环都会进行一次全表扫描
上述示例主要用于演示WHILE循环的用法
二、REPEAT循环:至少执行一次的保证 与WHILE循环不同,REPEAT循环至少会执行一次,因为它的执行依赖于循环体末尾的条件判断
如果条件为假(FALSE),循环继续;为真(TRUE),则终止循环
语法结构: sql 【label:】 REPEAT -- 循环体语句 UNTIL condition END REPEAT【label】; 在REPEAT循环中,`UNTIL condition`是关键,它指定了循环终止的条件
注意,条件判断是在每次循环体执行完毕后进行的
示例应用: 考虑一个场景,我们需要生成一个包含1到100数字的临时表
REPEAT循环非常适合这种需要至少执行一次的情况
sql DELIMITER // CREATE PROCEDURE generate_numbers() BEGIN DECLARE i INT DEFAULT1; DROP TEMPORARY TABLE IF EXISTS temp_numbers; CREATE TEMPORARY TABLE temp_numbers(num INT); REPEAT INSERT INTO temp_numbers(num) VALUES(i); SET i = i +1; UNTIL i >100 END REPEAT; END // DELIMITER ; 在这个例子中,即使`i`的值从一开始就大于100(虽然这种假设不实际),REPEAT循环也会尝试至少插入一次数据(当然,在这种情况下,循环会立即终止)
三、LOOP循环:无条件循环的灵活掌控 LOOP循环是MySQL中最基本的循环结构,它不依赖于任何初始条件,因此必须手动控制循环的终止
这通常通过`LEAVE`语句实现,该语句允许立即退出循环
语法结构: sql 【label:】 LOOP -- 循环体语句 IF condition THEN LEAVE loop_label; --退出循环 END IF; END LOOP【label】; 在LOOP循环中,`LEAVE`语句是退出循环的关键
`loop_label`必须与循环定义时的标签相匹配(如果使用了标签)
示例应用: 回到之前的加薪例子,但这次我们使用LOOP循环来实现: sql DELIMITER // CREATE PROCEDURE increase_salary_loop() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE emp_id INT; DECLARE emp_salary DECIMAL(10,2); DECLARE cur CURSOR FOR SELECT id, salary FROM employees WHERE salary <5000; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; emp_loop: LOOP FETCH cur INTO emp_id, emp_salary; IF d