当前位置: 首页
数据库
MySQL流程控制语句用法与语法详解

MySQL流程控制语句用法与语法详解

时间:2026-08-17
转载

一、条件判断语句1 IF 语句语法:IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] [ELSE statement_list] END IF示例:学生成绩等级评定DEL

一、条件判断语句

MySQL流程控制语句

1. IF 语句

语法:

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list]...
    [ELSE statement_list]
END IF


示例:学生成绩等级评定

DELIMITER //

CREATE PROCEDURE evaluate_student(IN student_id INT)
BEGIN
    DECLARE v_score DECIMAL(5,2);
    DECLARE v_grade VARCHAR(10);

获取学生成绩

  SELECT score INTO v_score FROM tb_student WHERE id = student_id;

IF 条件判断

 IF v_score >= 90 THEN
        SET v_grade = '优秀';
    ELSEIF v_score >= 80 THEN
        SET v_grade = '良好';
    ELSEIF v_score >= 60 THEN
        SET v_grade = '及格';
    ELSE
        SET v_grade = '不及格';
    END IF;

输出结果

    SELECT CONCAT('学生ID: ', student_id, ', 分数: ', v_score, ', 等级: ', v_grade) AS result;
END //
DELIMITER ;


2. CASE 语句

两种形式:

形式一:简单 CASE(基于值匹配)

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list]...
    [ELSE statement_list]
END CASE


形式二:搜索 CASE(基于条件判断)

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list]...
    [ELSE statement_list]
END CASE


示例:根据月份判断季节

DELIMITER //

CREATE FUNCTION get_season(month_num INT) 
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
    DECLARE season VARCHAR(10);

使用搜索CASE

   CASE
        WHEN month_num BETWEEN 3 AND 5 THEN SET season = '春季';
        WHEN month_num BETWEEN 6 AND 8 THEN SET season = '夏季';
        WHEN month_num BETWEEN 9 AND 11 THEN SET season = '秋季';
        WHEN month_num = 12 OR month_num = 1 OR month_num = 2 THEN SET season = '冬季';
        ELSE SET season = '无效月份';
    END CASE;
    
    RETURN season;
END //
DELIMITER ;


调用示例

SELECT get_season(6);  -- 
返回 '夏季'

二、循环控制语句

1. LOOP + LEA VE 循环

语法:

[begin_label:] LOOP

statement_list

END LOOP [end_label]

示例:计算1到100的和

DELIMITER //

CREATE PROCEDURE calculate_sum()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE total INT DEFAULT 0;
    
    sum_loop: LOOP
        SET total = total + i;
        SET i = i + 1;
        
         --使用LEA VE跳出循环
        IF i > 100 THEN
            LEA VE sum_loop;
        END IF;
    END LOOP sum_loop;
    
    SELECT total AS '1到100的和';
END //

DELIMITER ;

2. WHILE 循环

语法:

[begin_label:] WHILE search_condition DO

statement_list

END WHILE [end_label]

示例:生成斐波那契数列

DELIMITER //

CREATE PROCEDURE generate_fibonacci(n INT)
BEGIN
    DECLARE a INT DEFAULT 0;
    DECLARE b INT DEFAULT 1;
    DECLARE temp INT;
    DECLARE counter INT DEFAULT 1;
    DECLARE result VARCHAR(1000) DEFAULT '0,1';
    
     WHILE --循环
    WHILE counter < n - 1 DO
        SET temp = a + b;
        SET a = b;
        SET b = temp;
        SET result = CONCAT(result, ',', temp);
        SET counter = counter + 1;
    END WHILE;
    
    SELECT result AS fibonacci_sequence;
END //

DELIMITER ;

调用生成前10个斐波那契数

CALL generate_fibonacci(10);

3. REPEAT 循环

语法:

[begin_label:] REPEAT

statement_list

UNTIL search_condition

END REPEAT [end_label]

示例:密码重试机制

DELIMITER //

CREATE PROCEDURE login_simulation()
BEGIN
    DECLARE attempt_count INT DEFAULT 0;
    DECLARE max_attempts INT DEFAULT 3;
    DECLARE is_success BOOLEAN DEFAULT FALSE;
    DECLARE input_password VARCHAR(20);
    
     --模拟密码验证
    REPEAT
        SET attempt_count = attempt_count + 1;
        SET input_password = CONCAT('pass', attempt_count);  模拟输入
        
         --这里应该是实际的密码验证逻辑
        IF input_password = 'pass3' THEN
            SET is_success = TRUE;
        END IF;
        
        SELECT CONCAT('第', attempt_count, '次尝试: ', 
                     IF(is_success, '登录成功', '密码错误')) AS login_status;
        
        UNTIL is_success OR attempt_count >= max_attempts
    END REPEAT;
    
    IF NOT is_success THEN
        SELECT '账户已锁定,请联系管理员' AS final_result;
    END IF;
END //


DELIMITER ;

4. ITERATE 语句(继续下一次循环)

示例:跳过偶数的累加

DELIMITER //

CREATE PROCEDURE sum_odd_numbers()
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE total INT DEFAULT 0;
    
    number_loop: LOOP
        SET i = i + 1;
        
         --如果是偶数,跳过本次循环
        IF i % 2 = 0 THEN
            ITERATE number_loop;
        END IF;
        
        SET total = total + i;
        
         --循环终止条件
        IF i >= 10 THEN
            LEA VE number_loop;
        END IF;
    END LOOP number_loop;
    
    SELECT total AS '1到10的奇数和'; -- 结果应为 25 (1+3+5+7+9)
END //


DELIMITER ;

```

三、流程控制综合示例

示例:学生成绩批量处理

DELIMITER //

CREATE PROCEDURE process_student_scores()

BEGIN

DECLARE v_id INT;

DECLARE v_name VARCHAR(50);

DECLARE v_score DECIMAL(5,2);

DECLARE done INT DEFAULT 0;

声明游标

DECLARE student_cursor CURSOR FOR

SELECT id, name, score FROM tb_student;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

创建临时结果表

若不存在临时表temp_results,则创建它:CREATE TEMPORARY TABLE IF NOT EXISTS temp_results (

student_id INT,

student_name VARCHAR(50),

original_score DECIMAL(5,2),

adjusted_score DECIMAL(5,2),

grade VARCHAR(10)

);

OPEN student_cursor;

process_loop: LOOP

FETCH student_cursor INTO v_id, v_name, v_score;

IF done THEN

LEA VE process_loop;

END IF;

条件判断:分数调整

IF v_score < 60 THEN

SET v_score = v_score + 5; 给不及格学生加5分

ELSEIF v_score > 95 THEN

SET v_score = 100; 最高分不超过100

END IF;

CASE 语句:评定等级

CASE

WHEN v_score >= 90 THEN SET @grade = 'A';

WHEN v_score >= 80 THEN SET @grade = 'B';

WHEN v_score >= 70 THEN SET @grade = 'C';

WHEN v_score >= 60 THEN SET @grade = 'D';

ELSE SET @grade = 'F';

END CASE;

插入结果

往临时结果表temp_results中插入值,分别是v_id、v_name、v_score以及变量@grade。

END LOOP process_loop;

CLOSE student_cursor;

输出最终结果

SELECT * FROM temp_results;

DROP TEMPORARY TABLE temp_results;

END //

DELIMITER ;

四、最佳实践和建议

1. 选择合适的循环:

已知循环次数:`WHILE` 或 `LOOP` + 计数器

未知循环次数,但有结束条件:`REPEAT`

需要灵活控制:`LOOP` + `LEA VE`/`ITERATE`

2. 避免无限循环:确保循环有明确的退出条件

3. 性能考虑:尽量减少循环内的数据库操作,优先使用集合操作

4. 标签使用:对于复杂嵌套循环,使用标签提高可读性

5. 错误处理:在循环中加入适当的异常处理

6. 游标结合:流程控制经常与游标结合使用处理逐行数据

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Redis是什么:核心特性、架构与应用场景解析

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

时间:2026-09-01 06:20
Windows 安装 MongoDB 完整图文教程

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

时间:2026-09-01 06:20
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

时间:2026-09-01 06:20
MacOS安装MongoDB完整教程

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

时间:2026-09-01 06:19
Ubuntu系统安装与配置Redis完整指南

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。

时间:2026-09-01 06:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全