Mysql数据库基础第七章:流程控制结构

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 流程控制语句能够控制存储过程中sql语句的执行程序。主要分为三大类- `顺序结构`:程序依次运行- `分支结构`:程序根据条件选择执行- `循环结构`:程序满足某条件时,重复执行

Mysql数据库基础系列

软件下载地址
提取码:7v7u
数据下载地址
提取码:e6p9
mysql数据库基础第一章:(一)数据库基本概念
mysql数据库基础第一章:(二)mysql环境搭建
mysql数据库基础第二章:(一)基础查询
mysql数据库基础第二章:(二)条件查询
mysql数据库基础第二章:(三)排序查询
mysql数据库基础第二章:(四)常见函数
mysql数据库基础第二章:(五)分组查询
mysql数据库基础第二章:(六)连接查询
mysql数据库基础第二章:(七)子查询
mysql数据库基础第二章:(八)子查询经典案例
mysql数据库基础第二章:(九)分页查询
mysql数据库基础第二章:(十)连接查询
mysql数据库基础第三章:DML语言
mysql数据库基础第四章:DDL(数据定义语言):库表的管理、数据类型与约束条件
mysql数据库基础第五章:(一)事务
mysql数据库基础第五章:(二)视图
mysql数据库基础第六章:变量、存储过程与函数
mysql数据库基础第七章:流程控制结构
mysql数据库基础第八章:窗口函数和公用表达式(CTE)


流程控制语句能够控制存储过程中sql语句的执行程序。主要分为三大类

  • 顺序结构:程序依次运行
  • 分支结构:程序根据条件选择执行
  • 循环结构:程序满足某条件时,重复执行

注意:只能运用于存储过程

1 分支结构

1.1 if函数

  • 实现简单的双分支
  • if (表达式1,表达式2,表达式3)

如果表达式1成立,则返回表达式2,否则返回表达式3

1.2 case结构

基本语法:
情况1:

CASE 表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

情况2:

CASE
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

作为独立的语句时,要在结尾加分号,并且只能用在begin-end中

1.2.1 案例

1.创建一个存储过程,输入score,如果大于90分,返回A;80-90,返回B;60-80,返回C;其他,返回D

DELIMITER $
CREATE PROCEDURE test_case1(IN score INT)
BEGIN
CASE 
WHEN score >= 90 THEN SELECT 'A';
WHEN score >= 80 THEN SELECT 'B';
WHEN score >= 60 THEN SELECT 'c';
ELSE SELECT 'D';
END CASE;
END $
DELIMITER ;

CALL test_case1(95);

2.输入员工编号,判断该员工薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的,但是奖金比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。

DELIMITER $
CREATE PROCEDURE test_case2( IN emp_id INT)
BEGIN
DECLARE emp_sal DOUBLE;
DECLARE bonus DOUBLE ;
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
CASE
WHEN emp_sal<9000
THEN UPDATE employees SET salary=9000 WHERE employee_id = emp_id;
WHEN emp_sal<10000 AND bonus IS NULL
THEN UPDATE employees SET commission_pct=0.01 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id;
END CASE;
END $
DELIMITER ;
CALL test_case2(200);
SELECT * FROM employees WHERE employee_id = 200;

3.输入员工编号,判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500

DELIMITER $
CREATE PROCEDURE test_case3( IN emp_id INT)
BEGIN
DECLARE work_time INT ;
SELECT YEAR(NOW())- YEAR(hiredate) INTO work_time FROM employees WHERE employee_id = emp_id;
CASE
WHEN work_time = 0
THEN UPDATE employees SET salary=salary + 50 WHERE employee_id = emp_id;
WHEN work_time = 1 
THEN UPDATE employees SET salary=salary + 100 WHERE employee_id = emp_id;
WHEN work_time = 2
THEN UPDATE employees SET salary=salary + 200 WHERE employee_id = emp_id;
WHEN work_time = 3
THEN UPDATE employees SET salary=salary + 300 WHERE employee_id = emp_id;
WHEN work_time = 4
THEN UPDATE employees SET salary=salary + 400 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary=salary + 500 WHERE employee_id = emp_id;
END CASE;
END $
DELIMITER ;
CALL test_case3(200);

1.3 if 结构

实现多重分支

if 条件1 then 语句1;
elseif 条件2 then 语句2;
else
end if 

只能用于begin-end

1.3.1案例

1.创建一个存储过程,输入score,如果大于90分,返回A;80-90,返回B;60-80,返回C;其他,返回D

DELIMITER $
CREATE PROCEDURE test_if1(IN score INT)
BEGIN 
if  score > 90 THEN SELECT 'A';
elseif score > 80 THEN SELECT 'B';
elseif score > 60 THEN SELECT 'c';
ELSE SELECT 'D';
END if;
END $
DELIMITER ;

call test_if(85);

2.声明存储过程定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。

DELIMITER $
CREATE PROCEDURE test_if2( IN emp_id INT)
BEGIN
declare emp_sal int;
DECLARE work_time INT ;
SELECT YEAR(NOW())- YEAR(hiredate) INTO work_time FROM employees WHERE employee_id = emp_id;
select salary into emp_sal from employees where employee_id = emp_id;
if emp_sal < 8000 and work_time > 5
then update employees set salary = salary + 500;
END if;
END $
DELIMITER ;
select * from employees where employee_id = 178;
CALL test_if2(178);

三种方法比较,当是简单的二分支时,使用if函数,当是等值判断时,使用case结构,当是多重分支时,用if结构。

2. 循环结构

2.1 while结构

while:先判断后执行,如果条件满足,则运行循环内语句,否则退出循环
语法:

label: while condition
do 
end while label

2.1.1 案例

1.市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程声明OUT参数num,输出循环次数。存储过程中实现循环给大家降薪,薪资降为原来的90%。直到全公司的平均薪资达到4000结束。并统计循环次数。

DROP PROCEDURE test_while1;
DELIMITER $
CREATE PROCEDURE test_while1(OUT num INT)
BEGIN
DECLARE avg_sal DOUBLE;
DECLARE i INT DEFAULT  0; # 定义降薪次数
SELECT AVG(salary) INTO avg_sal FROM employees;
WHILE avg_sal > 4000 DO
UPDATE employees SET salary = salary * 0.9;
SET i = i+1;
SELECT AVG(salary) INTO avg_sal FROM employees;
END WHILE ;
SET num = i;
END $

CALL test_while1(@sum);
SELECT @sum;

2.2 repeat结构

repeat语句创建一个带条件判断的循环过程。与WHILE循环不同的是,repeat循环首先会执行一次循环,然后在unile中进行表达式的判断,如果满足条件就退出,即end repeat;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。
repeat:先执行后判断

label: repeat
循环列表
until 结束条件
end repeat

2.2.1 案例

DELIMITER $
CREATE PROCEDURE test_repeat1()
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
UNTIL i >= 10
END REPEAT;
SELECT i;
END $
DELIMITER ;

2.2 loop:死循环

LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。

label: loop
循环体
end loop label

2.3 循环控制

循环控制结构有以下两种:

  • iterate:类似于continue,跳出此次循环,直接进入下一次循环
  • leave:类似于break结束循环

使用循环控制时需要在定义循环时加标签

2.3.1 leave语句

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。可以LEAVE 理解为 break。

案例

批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止

TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
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.3.2 iterate语句

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。类似于python中的 continue。
批量插入,根据次数插入到admin表中多条记录,只插入偶数次

TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
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 ITERATE a;
        END IF;
        
        INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
        
    END WHILE a;
END $


CALL test_while1(100)$
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 存储 缓存
MySQL执行流程
本文介绍了MySQL的执行流程,分为server层和引擎层。server层包含连接器、查询缓存、解析器、预处理器、优化器等组件,负责SQL的接收、解析、优化及执行;引擎层负责数据的存储与读取。文章详细解释了各组件的功能,如连接器负责用户身份认证,查询缓存提高查询效率,解析器进行SQL的词法和语法分析,预处理器验证表和字段的存在性,优化器选择最优执行计划,最终由查询执行引擎完成查询并将结果返回给客户端。
MySQL执行流程
|
3月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2月前
|
存储 SQL NoSQL
|
2月前
|
JSON 关系型数据库 MySQL
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
291 0
|
4月前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
140 7
|
4月前
|
SQL 关系型数据库 MySQL
Python操作pymysql数据库的流程与技巧
在现代软件开发中,Python作为一门高效且易于学习的编程语言,广泛应用于各种场景,其中包括数据库操作。**PyMySQL** 是一个流行的Python数据库接口,用于连接和操作MySQL数据库。它提供了一种简便的方法来执行SQL语句、处理数据和管理数据库事务。以下是使用PyMySQL操作MySQL数据库的流程与技巧,旨在为开发者提供一个清晰、实用的指南。
76 0
|
6月前
|
Oracle 关系型数据库 数据库连接
|
6月前
|
SQL 关系型数据库 MySQL
Mysql:如何自定义导出表结构
通过以上方法,你可以灵活地自定义导出MySQL中的表结构,以满足不同的需求和场景。在进行操作的时候要注意权限问题以及路径问题,确保MySQL用户有权限写入指定的文件路径。在执行导出任务之前,还应确保你对数据库及其内容有足够的了解,以避免不必要的数据丢失或损坏。
115 1
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之要将MySQL同步到Doris,并设置整库同步,只变更库名、表名和表结构都不变,该如何设置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis