Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【重学 MySQL】八十一、揭秘分支结构王者——IF 的绝妙运用

【重学 MySQL】八十一、揭秘分支结构王者——IF 的绝妙运用

作者头像
用户11332765
发布于 2024-11-13 01:15:53
发布于 2024-11-13 01:15:53
21900
代码可运行
举报
文章被收录于专栏:编程编程
运行总次数:0
代码可运行
【重学 MySQL】八十一、揭秘分支结构王者——IF 的绝妙运用
在这里插入图片描述
在这里插入图片描述

流程控制分类

MySQL 中,流程控制是数据库编程的重要组成部分,它允许开发者根据条件执行不同的代码块。MySQL 的流程控制主要分为三类:顺序结构、分支结构和循环结构。其中,IF 语句是分支结构中的一种,用于在存储过程、函数和触发器中根据条件控制流程。

  1. 顺序结构
    • 程序从上到下依次执行,这是最基本的流程控制结构。
  2. 分支结构
    • 程序根据条件选择执行路径,从两条或多条路径中选择一条执行。
    • 分支结构包括 IF 语句、CASE 语句等。
  3. 循环结构
    • 程序在满足一定条件的基础上,重复执行一段代码。
    • 循环结构包括 LOOP、WHILE、REPEAT 等。

分支结构之 IF

在 MySQL 中,IF 语句是分支结构的核心,它允许根据条件执行不同的操作。以下是 IF 语句的详细语法结构及其在不同场景下的应用举例。

IF 语句的语法结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]……
[ELSE 操作N]
END IF

这里,“[]”中的内容是可选的,表示可以添加多个 ELSEIF 分支以及一个最终的 ELSE 分支。

特点

  1. 不同的表达式对应不同的操作。
  2. IF 语句通常使用在 BEGIN…END 块中,特别是在存储过程、函数和触发器中。

举例

举例1:简单的 IF 语句应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER //

CREATE PROCEDURE check_val_null(IN val INT)
BEGIN
    IF val IS NULL THEN
        SELECT 'val is null';
    ELSE
        SELECT 'val is not null';
    END IF;
END //

DELIMITER ;

举例2:更新员工薪资(update_salary_by_eid1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER //

CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT)
BEGIN
    DECLARE emp_salary DECIMAL(10,2);
    DECLARE hire_year INT;

    -- 获取员工薪资和入职年数
    SELECT salary, TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) INTO emp_salary, hire_year
    FROM employees WHERE employee_id = emp_id;

    -- 判断条件并执行更新
    IF emp_salary < 8000 AND hire_year > 5 THEN
        UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
    END IF;
END //

DELIMITER ;

注意:在获取入职年数时,原示例使用了 DATEDIFF(CURDATE(),hire_date)/365,这种方法不够精确,因为一年可能有365天或366天。改用 TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) 更为准确。

举例3:更新员工薪资(update_salary_by_eid2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER //

CREATE PROCEDURE update_salary_by_eid2(IN emp_id INT)
BEGIN
    DECLARE emp_salary DECIMAL(10,2);
    DECLARE hire_year INT;

    -- 获取员工薪资和入职年数
    SELECT salary, TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) INTO emp_salary, hire_year
    FROM employees WHERE employee_id = emp_id;

    -- 判断条件并执行更新
    IF emp_salary < 9000 AND hire_year > 5 THEN
        UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
    ELSE
        UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
    END IF;
END //

DELIMITER ;

举例4:更新员工薪资和奖金比例(update_salary_by_eid3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER //

CREATE PROCEDURE update_salary_by_eid3(IN emp_id INT)
BEGIN
    DECLARE emp_salary DECIMAL(10,2);
    DECLARE bonus_ratio DECIMAL(5,2);

    -- 获取员工薪资和奖金比例
    SELECT salary, bonus INTO emp_salary, bonus_ratio
    FROM employees WHERE employee_id = emp_id;

    -- 判断条件并执行更新
    IF emp_salary < 9000 THEN
        UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
    ELSEIF emp_salary >= 9000 AND emp_salary < 10000 AND bonus_ratio IS NULL THEN
        UPDATE employees SET bonus_ratio = 0.01 WHERE employee_id = emp_id;
    ELSE
        UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
    END IF;
END //

DELIMITER ;

注意:在举例4中,原示例中的 bonus 字段可能需要根据实际情况替换为正确的奖金比例字段名(如果数据库中该字段名为 bonus_ratio,则无需替换)。同时,由于示例中未明确奖金比例字段的存在,因此假设该字段名为 bonusbonus_ratio,并相应地进行了调整。在实际应用中,请确保字段名的正确性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PL/SQL 编程(一)基础,变量,分支,循环,异常
SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL)。可以方便的调用相应语句来去的结果,特点是非过程化,使用的时候不用指明执行的具体方法,不用关注实现的细节,但是某些情况下满足不了复杂业务流程的需求。 PL/SQL是 Procedure Language & Structured Query Language 的缩写。属于第三代语言(3GL),是一种过程化语言。PL/SQL是对SQL语言
二十三年蝉
2018/02/28
1.9K0
PL/SQL 编程(一)基础,变量,分支,循环,异常
第16章_变量、流程控制与游标
在 MySQL 数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。
程序员Leo
2023/08/07
6250
第16章_变量、流程控制与游标
SQL面试 100 问
本文介绍并分析了 100 道常见 SQL 面试题,主要分为三个模块:SQL 初级查询、SQL 高级查询以及数据库设计与开发。
FunTester
2022/12/09
2.8K0
数据库期末大作业之职员管理系统(C++语言)
数据库原理与应用实验大作业使学生通过对数据库基础知识的学习,掌握数据库基本操作,使学生掌握应用数据库所必须的所有核心概念和内容,在这个过程中激发学生学习的兴趣,并为后续的专业课程的学习打下坚实的基础。在课内,给学生布置一个数据库设计应用的任务。学生在教师的指导下,以任务驱动方式使学生们熟练掌握数据库的基本应用。
猫咪-9527
2025/06/11
2140
数据库期末大作业之职员管理系统(C++语言)
MySQL学习笔记【基础篇】
1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言
_DIY
2020/08/19
2.3K0
MySQL学习笔记【基础篇】
MySQL数据库,从入门到精通:第十五篇——MySQL存储过程和函数详解
存储过程和函数是MySQL数据库中常用的数据处理工具,它们可以帮助用户完成一些复杂的数据操作或业务逻辑处理,提高数据库系统的效率和性能。本文将深入剖析MySQL中存储过程和函数的使用方法,包括创建、调用、修改、删除等操作,并探讨存储过程和函数的优缺点和使用场景,帮助读者更好地掌握MySQL中存储过程和函数的使用方法和技巧。
默 语
2024/11/20
6460
【重学 MySQL】八十五、游标的使用
在 MySQL 中,游标(Cursor)是一种数据库对象,允许逐行处理查询结果集。游标特别适用于需要逐行处理数据的场景,比如复杂的数据处理、逐行更新或需要逐行检查的逻辑。
用户11332765
2024/11/20
3980
【重学 MySQL】八十五、游标的使用
游标和动态SQL
游标类别:静态游标(指在编译的时候,游标就与一个select语句进行了静态绑定的游标,这种游标只能作用于一个查询语句)和动态游标(就是希望我们的查询语句在运行的时候才跟游标绑定,为了使用动态游标,必须声明游标变量)。
全栈程序员站长
2022/09/09
1.2K0
MySQL基础-变量/流程控制/游标/触发器
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据
用户9645905
2023/04/02
1.7K0
MySQL基础-变量/流程控制/游标/触发器
6.存储过程中的游标使用(6/10)
在数据库编程中,游标(Cursor)是一种重要的数据库对象,它允许开发者逐行处理查询结果集。这对于需要对每一行数据进行特定处理的场景非常有用,如数据转换、数据清洗、复杂计算等。本文将详细介绍游标的概念、使用方法以及在存储过程中的应用。
正在走向自律
2024/12/18
7230
6.存储过程中的游标使用(6/10)
MySQL——SQL练习题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100174.html原文链接:
全栈程序员站长
2021/05/21
9510
MySQL——SQL练习题
LeetCode刷题100道,让你滚瓜烂熟拿下SQL「建议收藏」
对人工智能感兴趣的小伙伴,请多关注以下通俗易懂,风趣幽默的人工智能体系分析 https://www.captainai.net/jeames
全栈程序员站长
2022/11/10
3.7K0
LeetCode刷题100道,让你滚瓜烂熟拿下SQL「建议收藏」
MySQL存储过程与函数精讲
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
小熊学Java
2023/07/16
7160
MySQL存储过程与函数精讲
存储过程与函数
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可
一个风轻云淡
2022/11/13
7670
存储过程与函数
MySQL基础-变量/流程控制/游标
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据
用户9645905
2023/04/01
2.4K0
MySQL基础-变量/流程控制/游标
MySQL系列专题(2)-MySQL的SQL语句和高级特性
一、 DML 操作【重点】 ---- 1.1 新增(INSERT) INSERT INTO 表名(列 1,列 2,列 3…) VALUES(值 1,值 2,值 3…); 1.1.1 添加一条信息 #添加一条工作岗位信息 INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',2500,9000); #添加一条员工信息 INSERT INTO `t_employees` (EM
用户4919348
2022/01/06
4K0
MySQL系列专题(2)-MySQL的SQL语句和高级特性
PL/SQL学习笔记_01_基础:变量、流程控制
PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行
shirayner
2018/08/10
9340
PL/SQL学习笔记_01_基础:变量、流程控制
MySql基础之触发器
2、创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向 test_trigger_log数据表中插入before_insert的日志信息。
Java微观世界
2025/01/21
2480
SQL面试实战,30分钟征服美女面试官
:我看到你有考勤系统开发经验,假设现在有个需求:给定某天的员工打卡记录,需要查询每个人当天最早和最晚的打卡时间。你会如何设计SQL查询?
不惑
2025/04/22
1500
SQL面试实战,30分钟征服美女面试官
MySQL触发器
在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时 在库存表中添加一条库存记录。 这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用 事务 包裹起来,确保这两个操 作成为一个 原子操作 ,要么全部执行,要么全部不执行。
一个风轻云淡
2022/11/13
4K0
MySQL触发器
相关推荐
PL/SQL 编程(一)基础,变量,分支,循环,异常
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档