博客
关于我
MySQL学习笔记(十八)—— MySQL的流程控制结构
阅读量:731 次
发布时间:2019-03-21

本文共 3770 字,大约阅读时间需要 12 分钟。

流程控制结构是编程中的核心内容之一,通过顺序、分支、循环等方式实现程序的逻辑步骤管理。对于SQL程序来说,流程控制结构尤为重要,可以有效地实现数据处理的复杂需求。本文将从分支结构和循环结构两个主要方面,详细讲解流程控制的实现方法。

一、分支结构

在SQL程序中,分支结构通过ifcase等语法实现程序的多路径执行。常用的分支结构包括if函数和case结构。

1. if函数

if函数是一个基础的分支语法,具有两种使用方式:

方式一:简单分支

IF conditional_expression THEN    -- 执行此处的语句    statement;ELSE    -- 执行备用语句    other_statement;END IF;

方式二:多重分支

通过elseif实现多次条件判断:

IF condition1 THEN    statement1;ELSEIF condition2 THEN    statement2;...ELSE    statementN;END IF;

适用场景if函数适用于在beginend块内的多重分支操作。

2. case结构

case结构在某些数据库系统中类似于编程语言中的switch语法,支持根据变量或表达式的值实现分支执行。

使用方法

方式一:基于常量的分支

CASE    WHEN value1 THEN        -- 执行对应语句        statement1;    WHEN value2 THEN        -- 执行另一个语句        statement2;    ...    ELSE        -- 处理未匹配的值        default_statement;END CASE;

方式二:基于条件表达式的分支

CASE    WHEN conditional_expression THEN        statement1;    WHEN another_condition THEN        statement2;    ELSE        default_statement;END CASE;

适用场景:适用于处理基于不同值的分支操作,通常用于简单的if-else逻辑。

案例演示

案例1:创建函数,根据成绩返回相应的评级

CREATE FUNCTION test_if(score FLOAT) RETURNS CHARBEGIN    DECLARE ch CHAR DEFAULT 'F';    CASE        WHEN score > 90 THEN SET ch = 'A';        WHEN score > 80 THEN SET ch = 'B';        WHEN score > 60 THEN SET ch = 'C';        ELSE SET ch = 'D';    END CASE;    RETURN ch;END $SELECT test_if(87);

案例2:创建存储过程,根据工资调整

CREATE PROCEDURE test_if_pro(IN sal DOUBLE)BEGIN    IF sal < 2000 THEN        DELETE FROM employees WHERE employees.salary = sal;    ELSEIF sal > 2000 AND sal < 5000 THEN        UPDATE employees SET salary = salary + 1000;    ELSE        UPDATE employees SET salary = salary + 500;    END IF;END $CALL test_if_pro(2100);

二、循环结构

循环结构是实现重复操作的核心工具,在SQL中主要包括whilelooprepeat三种循环控制语法。

1. while循环

while循环基于条件进行控制,适用于需要特定次数执行操作的场景。

语法示例:

【标签:】while condition DO    -- 执行循环体    loop_body;END WHILE 【标签】;

案例:批量插入记录

DELIMITER $ CREATE PROCEDURE pro_while1(IN insertCount INT)BEGIN    DECLARE i INT DEFAULT 1;    WHILE i <= insertCount DO        INSERT INTO admin(username, password) VALUES(CONCAT('Rose', i), '666');        SET i = i + 1;    END WHILE;END $CALL pro_while1(100);

案例扩展:带有leave语句的循环

DELIMITER $ CREATE PROCEDURE test_while1(IN insertCount INT)BEGIN    DECLARE i INT DEFAULT 1;    a: WHILE i <= insertCount DO        INSERT INTO admin(username, password) VALUES(CONCAT('xiaohua', i), '0000');        IF i >= 20 THEN LEAVE a;        END IF;        SET i = i + 1;    END WHILE a;END $CALL test_while1(100);

2. loop循环

loop循环类似于一个无限循环,可以用来实现简单的死循环。

语法示例:

【标签:】loop    -- 定义循环体    loop_body;END LOOP 【标签】;

案例:模拟简单死循环

DELIMITER $ CREATE PROCEDURE test_loop(IN isOk BOOLEAN)BEGIN    WHILE 1 DO        IF isOk THEN            -- 执行成功逻辑            SELECT '成功';        ELSE SELECT '失败';        END IF;    END WHILE;END $CALL test_loop(1);

3. repeat循环

repeat循环基于条件继续执行,更适合根据某个条件重复操作。

语法示例:

【标签:】repeat    -- 循环体    repeat_body;UNTIL condition END repeat 【标签】;

案例:批量插入偶数次

DELIMITER $ CREATE PROCEDURE test_while1(IN insertCount INT)BEGIN    DECLARE i INT DEFAULT 0;    a: WHILE i <= insertCount DO        SET i = i + 1;        IF MOD(i, 2) != 0 THEN            INSERT INTO admin(username, password) VALUES(CONCAT('xiaohua', i), '0000');        END IF;    END WHILE a;END $CALL test_while1(100);

流程控制结构经典案例讲解

案例:随机插入字符串

DELIMITER $ CREATE PROCEDURE test_randstr_insert(IN insertCount INT)BEGIN    DECLARE i INT DEFAULT 1;    DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';    DECLARE startIndex INT;    DECLARE len INT;    WHILE i <= insertCount DO        SET startIndex = FLOOR(RAND() * 26 + 1);        SET len = FLOOR(RAND() * (20 - startIndex + 1) + 1);        INSERT INTO stringcontent(content) VALUES(SUBSTR(str, startIndex, len));        SET i = i + 1;    END WHILE;END $CALL test_randstr_insert(10);

这些案例展示了流程控制在实际开发中的多种应用场景,通过合理搭配分支和循环结构,可以有效地实现复杂的数据处理任务。

转载地址:http://xhtgz.baihongyu.com/

你可能感兴趣的文章
Mysql-事务阻塞
查看>>
Mysql-存储引擎
查看>>
mysql-开启慢查询&所有操作记录日志
查看>>
MySQL-数据目录
查看>>
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
MySQL-索引的分类(聚簇索引、二级索引、联合索引)
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>
mysql-递归查询(二)
查看>>
MySQL5.1安装
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>