博客
关于我
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/

你可能感兴趣的文章
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>