当前位置: 首页 > news >正文

Mysql 流程控制

简介

我们可以在存储过程和函数中实现比较复杂的业务逻辑,但是需要对应的流程控制语句来控制,就像Java中分支和循环语句一样,在MySQL中也提供了对应的语句,接下来就详细的介绍下。

在这里插入图片描述
在这里插入图片描述

1.分支结构

1.1 IF语句

IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]……
[ELSE 操作N]
END IF

案例:

# IF语句的基本使用
CREATE PROCEDURE PROC_IF2(IN age int)
BEGIN
#DECLARE AGE INT(3) DEFAULT 12;
IF AGE < 18
THEN SELECT '未成年';
ELSEIF AGE BETWEEN 18 AND 30 THEN SELECT '青年人';
ELSEIF AGE BETWEEN 30 AND 60 THEN SELECT '中年人';
ELSE SELECT '老年人';
END IF;
END;
# 调用存储过程
CALL PROC_IF2(77) ;

1.2 CASE语句

CASE语句的语法结构1:

#情况一:类似于switch
CASE 表达式
WHEN1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

CASE语句的语法结构2:

#情况二:类似于多重if
CASE
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

2.循环结构

2.1 LOOP语句

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

[loop_label:] LOOP
循环执行的语句
END LOOP [loop_label]

其中,loop_label表示LOOP语句的标注名称,该参数可以省略

案例:使用LOOP语句循环操作,循环10次后退出

# 使用LOOP语句进行循环,循环10次,输出信息
# 创建存储过程,使用LOOP处理循环操作
CREATE PROCEDURE PROC_LOOP()
BEGIN
DECLARE I INT DEFAULT 0 ;
ADD_LOOP:LOOP
SELECT I;
SET I = I + 1;
IF I >= 10 THEN LEAVE ADD_LOOP;
END IF;
END LOOP ADD_LOOP;
END;# 调用存储过程
CALL PROC_LOOP();

2.2 WHILE语句

WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。WHILE语句的基本格式如下:

[while_label:] WHILE 循环条件 DO
循环体
END WHILE [while_label];

案例:创建存储过程,并通过while语句循环10次

# 创建一个存储过程,使用WHILE来实现10次循环的操作
CREATE PROCEDURE PROC_WHILE1()
BEGIN
DECLARE I INT DEFAULT 0;
ADD_WHILE:WHILE I <= 10 DO
# 在循环体中我们需要修改条件变量
SELECT I ;
SET I = I + 1;
END WHILE ADD_WHILE;
END;
# 在WHILE循环中我们省略了 while_lable
CREATE PROCEDURE PROC_WHILE2()
BEGIN
DECLARE I INT DEFAULT 0;
WHILE I <= 10 DO
# 在循环体中我们需要修改条件变量
SELECT I ;
SET I = I + 1;
END WHILE ;
END;# 调用存储过程
CALL PROC_WHILE1();

2.3 REPEAT语句

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

[repeat_label:] REPEAT
循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]

案例:创建存储过程,通过REPEAT语句实现循环5次的操作

# 创建一个存储过程,循环5次
CREATE PROCEDURE PROC_REPEAT()
BEGIN
DECLARE I INT DEFAULT 0;
REPEAT
# SELECT I;
SET I = I + 1;
UNTIL I >= 5
END REPEAT ;
SELECT I;
END;
DROP PROCEDURE PROC_REPEAT;
# 调用存储过程
CALL PROC_REPEAT();

2.4 对比三种循环结构

    1. 这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
    1. LOOP:一般用于实现简单的"死"循环
      WHILE:先判断后执行
      REPEAT:先执行后判断,无条件至少执行一次

3.跳转语句

3.1 LEAVE语句

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break。

基本格式如下:

LEAVE 标记名
-- 其中,label参数表示循环的标志。LEAVE和BEGIN ... END或循环一起被使用

案例:

CREATE PROCEDURE PROC_LOOP()
BEGIN
DECLARE I INT DEFAULT 0 ;
ADD_LOOP:LOOP
SELECT I;
SET I = I + 1;
IF I >= 10 THEN LEAVE ADD_LOOP; # LEAVE ADD_LOOP;退出LOOP循环 相当Java中的break关键字
END IF;
END LOOP ADD_LOOP;
END;

3.2 ITERATER语句

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为continue ,意思为“再次循环”。

ITERATE label
-- label参数表示循环的标志。ITERATE语句必须跟在循环标志前面

案例:

# 跳转语句的使用
CREATE PROCEDURE PROC_ITERATE() BEGIN DECLARE I INT DEFAULT 0; ADD_LOOP :LOOP 
SET I = I + 1; IF I & gt;= 10 THEN LEAVE ADD_LOOP; # LEAVE 结束当前循环语句END IF; IF I = 5 THEN ITERATE ADD_LOOP; # ITERATE 跳过当前循环开始下一场循环END IF; 
SELECT I; END LOOP ADD_LOOP; END; # 调用存储过程
CALL PROC_ITERATE();

相关文章:

Mysql 流程控制

简介 我们可以在存储过程和函数中实现比较复杂的业务逻辑&#xff0c;但是需要对应的流程控制语句来控制&#xff0c;就像Java中分支和循环语句一样&#xff0c;在MySQL中也提供了对应的语句&#xff0c;接下来就详细的介绍下。 1.分支结构 1.1 IF语句 IF 表达式1 THEN 操作1…...

Java学习笔记之----I/O(输入/输出)二

【今日】 孩儿立志出乡关&#xff0c;学不成名誓不还。 文件输入/输出流 程序运行期间&#xff0c;大部分数据都在内存中进行操作&#xff0c;当程序结束或关闭时&#xff0c;这些数据将消失。如果需要将数据永久保存&#xff0c;可使用文件输入/输出流与指定的文件建立连接&a…...

2024字节跳动校招面试真题汇总及其解答(一)

1. 【算法题】重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:hea…...

【Nginx23】Nginx学习:响应头与Map变量操作

Nginx学习&#xff1a;响应头与Map变量操作 响应头是非常重要的内容&#xff0c;浏览器或者客户端有很多东西可能都是根据响应头来进行判断操作的&#xff0c;比如说最典型的 Content-Type &#xff0c;之前我们也演示过&#xff0c;直接设置一个空的 types 然后指定默认的数据…...

前端代理报错Error occured while trying to proxy to: localhost:端口

webpack配置进行前端代理时&#xff0c; 报错信息如下&#xff1a;(DEPTH_ZERO_SELF_SIGNED_CERT) 需设置&#xff1a;secure为false即可解决此报错 // webpack配置前端代理config["/test"]{target: https://xxxx.com,changeOrigin: true,secure: false // 这个配置…...

QT DAY6

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);socket new QTcpSocket(this);//如果连接服务器成功&#xff0c;该客户端就会发射一个connected的信号。//我们…...

Slint学习文档

Slint学习文档 Slint Learn如何学习本文档学习顺序标志说明 Slint With VSCodeSlint With Rust依赖&#x1f44e;定义宏 Slint与Rust分离1.添加编译依赖&#xff08;slint-build&#xff09;2.编写slint文件3.编写build.rs4.编写main.rs 普通组件主窗体Windowexample 文本Texte…...

【最新!七麦下载量analysis参数】逆向分析与Python实现加密算法

文章目录 1. 写在前面2. 请求分析3. 加密分析4. 算法实现 1. 写在前面 之前出过一个关于榜单analysis的分析&#xff0c;有兴趣的可以查看这篇文章&#xff1a;七麦榜单analysis加密分析 最近运营团队那边有同事找到我们&#xff0c;说工作中偶尔需要统计分析一下某APP在一些主…...

蓝桥杯练习题(3的倍数)

问题描述 小蓝对 3 的倍数很感兴趣。现在他手头有三个不同的数 a,b,c, 他想知道, 这三个数中是不是有两个数的和是 3 的倍数。 例如, 当 a3,b4,c6 时, 可以找到 a 和 c 的和是 3 的倍数。 例如, 当 a3,b4,c7 时, 没办法找到两个数的和是 3 的倍数。 输入格式 输入三行, 每行…...

安装Qe-7.2细节

编译 直接编译报错&#xff0c;发现要使用gpu加速。 检查linux的GPU: nvidia-smi lspci |grep -i nvidia module load cuda ./configure make all 安装curl mkdir build cd build …/configure --prefix/home/bin/local/curl make make install 加入路径&#xff1a; expor…...

3.运行项目

克隆项目 使用安装的git克隆vue2版本的若依项目&#xff0c;博主使用的版本是3.8.6. git clone https://gitee.com/y_project/RuoYi-Vue.git目录结构如下图所示&#xff0c;其中ruoyi-ui是前端的内容&#xff0c;其它均为后端的内容。 配置mysql数据库 在数据库里新建一个…...

【算法题】2651. 计算列车到站时间

题目&#xff1a; 给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意&#xff0c;该问题中的时间采用 24 小时制。 示例 1…...

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大&#xff0c;pojo实体类可以直接写进mapper接口里面&#xff0c;不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解&#xff0c;取值的时候直接写属性 //这里是单参数&#xff0c;可以不加param&#xff01…...

flink 写入数据到 kafka 后,数据过一段时间自动删除

版本 flink 1.16.0kafka 2.3 流程描述&#xff1a; flink利用KafkaSource&#xff0c;读取kafka的数据&#xff0c;然后经过一系列的处理&#xff0c;通过KafkaSink&#xff0c;采用 EXACTLY_ONCE 的模式&#xff0c;将处理后的数据再写入到新的topic中。 问题描述&#xff1…...

golong基础相关操作--一

package main//go语言以包作为管理单位&#xff0c;每个文件必须先声明包 //程序必须有一个main包 // 导入包&#xff0c;必须要要使用 // 变量声明了&#xff0c;必须要使用 import ("fmt" )/* * 包内部的变量 */ var aa 3var ss "kkk"var bb truevar …...

【深度学习】基于卷积神经网络的铁路信号灯识别方法

基于卷积神经网络的铁路信号灯识别方法 摘 要&#xff1a;1 引言2 卷积神经网络模型2.1 卷积神经网络结构2.2.1 卷积层2.2.2 池化层2.2.3 全连接层 3 卷积神经网络算法实现3.1 数据集制作3.2 卷积神经网络的训练过程3.2.1 前向传播过程 4 实验5 结语 摘 要&#xff1a; 目前中…...

DR IP-SoC China 2023 Day演讲预告 | 龙智Perforce专家解析芯片开发中的数字资产管理

2023年9月6日&#xff08;周三&#xff09;&#xff0c;龙智即将亮相于上海举行的D&R IP-SoC China 2023 Day&#xff0c;呈现集成了Perforce与Atlassian产品的芯片开发解决方案&#xff0c;助力企业更好、更快地进行芯片开发。 D&R IP-SoC China 2023 Day 是中国首个…...

解决github连接不上的问题

改 hosts 我们在浏览器输入 GitHub 的网址时&#xff0c;会向 DNS 服务器发送一个请求&#xff0c;获取到 GitHub 网站所在的服务器 IP 地址&#xff0c;从而进行访问。 就像你是一名快递员&#xff0c;在送快递前要先找中间人询问收件人的地址。而 DNS 就是这个告诉你目标地址…...

# DevOps名词定义梳理

DevOps名词定义梳理 极限编程座右铭&#xff1a;如果它令你很受伤&#xff0c;那么就做更多的练习&#xff08;If it hurts, do it more often&#xff09; 经常人们会把这些名词用错&#xff1a; 构建&#xff1a;就是把源代码制成成品的过程&#xff0c;这个过程一般会有单元…...

Redis Cluster

文章目录 一、集群搭建1 节点规划2 集群启动 二、配置一致性1 基本分工2 更新规则 三、Sharding1 数据分片分片实现分片特点 2 slot迁移迁移原因迁移支持集群扩容迁移错误背景现象问题分析验证猜想 集群缩容 3. 请求路由client端server端migrating节点的读写importing节点的读写…...

基于圣女司幼幽-造相Z-Turbo的Java面试题智能生成与解析实战

基于圣女司幼幽-造相Z-Turbo的Java面试题智能生成与解析实战 最近在帮团队招聘Java工程师&#xff0c;一个很深的感触是&#xff1a;准备面试题太费劲了。不同岗位&#xff08;比如后端开发和大数据开发&#xff09;需要的技术栈侧重点完全不同&#xff0c;网上找的题目要么太…...

跨平台QGIS二次开发环境实战:从源码编译到工程配置(QGIS 3.28 + Qt 5.15)

1. 跨平台QGIS开发环境全景概览 第一次接触QGIS二次开发的朋友可能会被复杂的依赖关系吓到&#xff0c;特别是当需要在不同操作系统上搭建环境时。我花了整整两周时间踩遍了Ubuntu和Windows平台的所有坑&#xff0c;最终总结出这套可复现的配置方案。QGIS作为开源GIS软件的标杆…...

出国旅行手机没信号?Nrfr免Root工具一键解锁全球网络

出国旅行手机没信号&#xff1f;Nrfr免Root工具一键解锁全球网络 【免费下载链接】Nrfr &#x1f30d; 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题&#xff0c;帮助使用海外 SIM 卡获得更好的本地化体验&#xff0c;解锁运营商限制&#xff0c;突破区域限制…...

PyArmor解包终极指南:3种高效逆向分析技巧快速掌握代码解密核心技术

PyArmor解包终极指南&#xff1a;3种高效逆向分析技巧快速掌握代码解密核心技术 【免费下载链接】PyArmor-Unpacker A deobfuscator for PyArmor. 项目地址: https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker PyArmor-Unpacker是一个专为Python开发者和安全研究人员…...

Anything to RealCharacters 2.5D转真人引擎效果可视化:预处理前后对比与输出质量评估

Anything to RealCharacters 2.5D转真人引擎效果可视化&#xff1a;预处理前后对比与输出质量评估 你是否曾想过&#xff0c;将心爱的动漫角色、游戏立绘或者卡通头像&#xff0c;一键变成一张以假乱真的真人照片&#xff1f;这听起来像是魔法&#xff0c;但现在&#xff0c;借…...

Emotion2Vec+语音情感识别系统:5分钟快速部署,9种情绪一键分析

Emotion2Vec语音情感识别系统&#xff1a;5分钟快速部署&#xff0c;9种情绪一键分析 1. 系统介绍与核心价值 1.1 什么是Emotion2Vec Emotion2Vec是一款基于深度学习的语音情感识别系统&#xff0c;能够自动分析语音中蕴含的情绪状态。这个由科哥二次开发构建的镜像版本&…...

Meta2d.js终极指南:从零构建专业级Web SCADA与数字孪生应用

Meta2d.js终极指南&#xff1a;从零构建专业级Web SCADA与数字孪生应用 【免费下载链接】meta2d.js The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so on. Meta2d.js是一个实时数…...

Sketchfab 3D模型本地化工具:Firefox浏览器专业解决方案

Sketchfab 3D模型本地化工具&#xff1a;Firefox浏览器专业解决方案 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 在数字创作领域&#xff0c;3D资源的离线获取与…...

Android崩溃分析进阶:结合addr2line与IDA Pro精准定位SO文件崩溃点

1. 从崩溃日志到问题定位&#xff1a;为什么SO文件这么难缠&#xff1f; 每次看到Android应用崩溃日志里出现"signal 11 (SIGSEGV)"这种字样&#xff0c;我就知道今晚又要加班了。特别是当崩溃发生在SO文件中时&#xff0c;那种无力感就像在漆黑的房间里找一根掉落的…...

ESP8266 AT指令实战:用NodeMCU连接WiFi并发送HTTP请求(2023最新版)

ESP8266 AT指令实战&#xff1a;用NodeMCU连接WiFi并发送HTTP请求&#xff08;2023最新版&#xff09; 当你拿起一块NodeMCU开发板时&#xff0c;它可能看起来只是块普通的电路板&#xff0c;但内置的ESP8266芯片让它成为了物联网开发的瑞士军刀。不同于Arduino需要额外WiFi模块…...