第65讲:MySQL存储过程之循环语法的核心概念与应用案例

news2024/9/23 11:14:52

文章目录

    • 1.存储过程中循环的种类
    • 2.WHILE循环控制
      • 2.1.WHILE循环语法格式
      • 2.2.WHILE循环经典案例
    • 3.REPEAT循环控制
      • 3.1.REPEAT循环语法结构
      • 3.2.REPEAT循环经典案例
    • 4.LOOP循环控制
      • 4.1.LOOP循环语法结构
      • 4.2.LOOP循环经典案例一
      • 4.3.LOOP循环经典案例二

1.存储过程中循环的种类

在存储过程中可以进行循环逻辑,常用的循环有while、repeat、loop三种。

while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。

repeat循环是当条件满足后,就会退出循环。

loop循环是死循环,需要我们手动增加退出循环的条件,否则将一直处于死循环中。

2.WHILE循环控制

while循环是根据条件进行循环控制的,当条件满足后,才会执行循环中的SQL语句。

2.1.WHILE循环语法格式

WHILE 条件 DO
	SQL逻辑
END WHILEWHILE中的条件满足时,则进行循环,否则不进行循环。

2.2.WHILE循环经典案例

计算从1累加到n的值,n可以作为存储结构的传参。

1)创建视图

思路:

1)首先定义一个局部变量total,用于记录每次累加后的结果。

2)然后进行WHILE循环,当n的值大于0的时候开始遍历循环,在循环中为total变量赋值,每次循环都为total的变量值+n,每次循环都对n的值减1,当n为0时,则退出循环,返回total的最终结果。

传入一个整数,每次循环都将这个整数与total变量值进行累加,每次循环后都要将n的值减1,并且将减之后的新n值带入下一次循环进行遍历,最终就能拿到累加的结果。

create procedure proc_8(in n int)				#传入n的变量值
begin
	declare total int default 0; 				#定义一个局部变量total,用于记录每次累加之后的结果,设置默认值为0
	
	while n > 0 do								#如果n的值大于0则开始循环
		set total := total + n;				     #每次循环先进行一个运算,total的值+n的值运算之后为total变量的新值
		set n := n - 1;							#每次循环在对变量n的值进行修改,每次循环都将n的值减1,直到n的值为0退出循环
	end while;
	
	select total;								#经过while循环之后total变量的值就是累加之后的结果
end;

2)调用视图

我们创建的视图proc_8,就可以计算从1到xxx的累加值,调用视图时传入要累加到多少的值即可,如下所示,要传入10,也就是计算从1到10的累加结果。

call proc_8(10);	

1到10的累加结果为55。

image-20220615221620556

3.REPEAT循环控制

REPEAT循环和WHILE循环正好相反,REPEAT循环是当条件满足时,则退出循环。

REPEAT循环会先进行一次逻辑,然后判断UNTIL中的条件是否满足,如果满足则退出循环,否则进行下一次循环。

特别注意UNTIL后面没有分号。

3.1.REPEAT循环语法结构

REPEAT
	SQL逻辑
	UNTIL 条件
END REPEAT

3.2.REPEAT循环经典案例

同样计算从1累加到n的值,n可以作为存储结构的传参。

1)创建存储过程

思路:

1)定义一个局部变量total,记录每次累加之后的新值。

2)然后每循环一次就将n的值与total的值累加,并对n的值减1,然后判断n是否小于等于0,如果小于等于0则退出循环。

create procedure proc_9(in n int)
begin
	declare total int default 0; 
	repeat
		set total := total + n;
		set n := n - 1;
		until n <= 0					#每次循环都为total变量的值加上n的值进行运算,同样也会为n的值减1,当n的值小于等于0时就表示全部累加完了,则会退出循环
	end repeat;
	
	select total;
end;

2)调用存储过程

call proc_9(10);

image-20220615223839968

4.LOOP循环控制

LOOP循环如果不指定退出循环的条件,那么可以实现简单的死循环。

如果我们不希望LOOP出现死循环,可以使用if条件结合LEAVE参数退出当前循环。

如果我们希望在LOOP循环根据条件跳过某一次循环,则可以使用ITERATE参数。

4.1.LOOP循环语法结构

循环名称:LOOP
	IF 条件 THEN
		LEAVE		#退出循环
	END IF
	
	IF 条件 THEN
		ITERATE 	#跳过本次循环
	END IF
	
	SQL逻辑
END LOOP 循环名称

4.2.LOOP循环经典案例一

计算从1累加到n的值,n可以作为存储结构的传参。

LOOP循环不会指定条件,不像WHILE和REPEAT可以根据条件来退出循环,但是LOOP循环可以配合IF流程控制来判断某个条件,当条件满足时则退出循环。

1)编写存储过程

思路:

1)首先定义局部变量total记录累加之后的新结果。

2)然后定义LOOP循环,在循环中首先定义一个IF流程控制,判断n的值是否为0,如果为0,则使用LEAVE退出循环。

3)定义完条件判断之后,再去定义SQL逻辑:每循环一次total变量值等于当前total值加n值,并且n的值要减1。

create procedure proc_10(in n int)
begin
	declare total int default 0; 
	
	leijia:loop							#定义一个loop循环并为之起名为leijia
	
		if n <= 0 then						#首先定义一个条件判断,否则loop循环一直处于死循环,当n的值为0时
			leave leijia;					#通过leave参数退出循环
		end if;
										#条件判断准备好之后,有了退出循环的条件,开始定义SQL逻辑
		set total := total + n;						#total变量的新值每次循环都要用当前total的值+n的值
		set n := n -1;							   #n变量的值每次循环都要减1
	
	end loop leijia;

	select total;						#最后查询total新值
end;

2)调用存储过程

call proc_10(10)

调用proc_10函数,传入整数10,最后就可以拿到1到10累加之后的结果。

image-20220615231932888

4.3.LOOP循环经典案例二

计算从1到n之间偶数累加的值,n为传入的参数。

本次案例难度有所提高,需要通过LOOP循环将传入的整数从1开始进行累加,还需要跳过奇数部分,只对偶数部分累加。

1)创建存储过程

思路:

1)首先定义局部变量total记录累加之后的新结果。

2)然后定义LOOP循环,在循环中首先定义一个IF流程控制,判断n的值是否为0,如果为0,则使用LEAVE退出循环。

3)然后再定义一个IF流程控制,主要用于判断当前n的变量值是否是奇数,如果是奇数则跳出本次循环,跳出本次循环的同时还要对n的值减1。

4)定义完条件判断之后,再去定义SQL逻辑:每循环一次total变量值等于当前total值加n值,并且n的值要减1。

如何判断n的变量值是否是奇数呢,其实也很简单,只要用n的变量值去除与2,并且取余数,如果余数为1,那么就表示该变量值为奇数,则退出循环。任何奇数除以2,余数都是1。

create procedure proc_11(in n int)
begin
	declare total int default 0; 
	
	leijia:loop							#定义一个loop循环并为之起名为leijia
	
		if n <= 0 then						#首先定义一个条件判断,否则loop循环一直处于死循环,当n的值为0时
			leave leijia;					#通过leave参数退出循环
		end if;
		
		if n%2 = 1 then						#当n的变量值除以2,余数为1时,这个n的变量值一定为奇数
			set n := n -1;					#将n的变量值减1
			iterate leijia;					#然后跳出本次循环
		end if;
										#条件判断准备好之后,有了退出循环的条件,开始定义SQL逻辑
		set total := total + n;						#total变量的新值每次循环都要用当前total的值+n的值
		set n := n -1;							   #n变量的值每次循环都要减1
	
	end loop leijia;

	select total;						#最后查询total新值
end;

整体LOOP循环内,第一个IF是来定义是否退出循环的,每次循环n的变量值都会减1,当n的变量值为0,则退出循环,第二个IF是来判断n的变量值是否为奇数,任何奇数除以2都会余1,当余数为1就表示此次变量值是奇数,那么就将n的变量值减1,然后跳出本次循环,进入下一次循环,条件判断都准备好之后,就可以定义累加的逻辑了,每次循环为total变量赋值(原total值+n值)并且将n的值每次减1。

image-20220615233657509

2)调用存储过程

call proc_11(10);

传入整数10 ,从1到10取偶数累加,2+4+6+8+10,结果为30.

image-20220615234607639

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 撤销已经push到远程的提交

git 撤销已经push到远程的提交 1. 情景2. 解决方法2.1 git revert2.2 git reset 1. 情景 工作中会有很多时候提交git的时候会提交错东西&#xff0c;而且已经push到远程的话怎么办呢&#xff1f; 2. 解决方法 2.1 git revert 一种常见的方法是使用 git revert 命令来创建一…

酷开科技,让家庭更有温度!

生活中总有一些瞬间&#xff0c;会让我们感到无比温暖和幸福。一个拥抱、一句问候、一杯热茶&#xff0c;都能让我们感受到家庭的温馨和关爱。酷开科技也用自己的方式为我们带来了独属于科技的温暖&#xff0c;通过全新的体验将消费者带进一个充满惊喜的世界&#xff0c;让消费…

iPhone无法关机未必是坏了!如何修复无法关闭的iPhone

iPhone运行很慢且发热是一个比较罕见的情况&#xff0c;但如果它发生在你身上&#xff0c;下面解释了发生的原因以及你如何修复它。 iPhone无法关闭的原因 iPhone无法关闭的最可能原因是&#xff1a; 由于软件问题&#xff0c;它被冻结了。 睡眠/唤醒按钮坏了。 屏幕坏了&a…

【Redis】环境配置

环境配置 Linux版本&#xff1a; Ubuntu 22.04.2 LTS 下载redis sudo apt install redis 启动redis redis-server 输入redis-server启动redis竟然报错了&#xff0c;原因是redis已经启动&#xff0c;网上大多数的解决方案如下&#xff1a; ps -ef | grep -i redis 查询redi…

软件开发项目文档系列之六概要设计:构建可靠系统的蓝图

概要设计是软件开发项目中至关重要的阶段&#xff0c;它为整个系统提供了设计蓝图和技术方向。它的重要性在于明确项目目标、规划系统结构、确定技术选择、识别风险、以及为团队提供共同的视角&#xff0c;确保项目在后续开发阶段按计划进行。概要设计的主要内容包括项目的背景…

九州未来入选“2023边缘计算产业图谱”三大细分领域

10月26日&#xff0c;边缘计算社区正式发布《2023边缘计算产业图谱》&#xff0c;九州未来凭借深厚的技术积累、优秀的产品服务、完善的产品解决方案体系以及开源贡献&#xff0c;实力入选图谱——边缘计算平台、边缘计算开源、边缘云服务提供商三大细分领域&#xff0c;充分彰…

统信UOS1060上修改sudo权限

原文链接&#xff1a;统信UOS1060上修改sudo权限 hello&#xff0c;大家好啊&#xff0c;今天给大家带来在统信UOS桌面操作系统1060上修改管理员权限&#xff0c;使其在使用sudo的时候&#xff0c;不要输入本用户密码验证的文章&#xff0c;主要通过修改 /etc/sudoers文件实现&…

恒驰服务 | 华为云数据使能专家服务offering之大数据建设

恒驰大数据服务主要针对客户在进行智能数据迁移的过程中&#xff0c;存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题&#xff0c;通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容&#xff0c;支撑客户实现快速稳定上云&#xff0c;有效降低时间成本…

el-upload 组件上传/移除/报错/预览文件,预览图片、pdf 等功能

目录 页面代码样式代码页面展示 页面代码 dialog.vue <!-- 上传文件 --> <template><el-dialogtitle"上传文件":visible.sync"dialogVisible"width"60%"top"6vh":close-on-click-modal"false"close"h…

中国人民大学与加拿大女王大学金融硕士——在职读研,演绎精彩的人生

为什么在职读研呢&#xff1f;这是对即将读研人的“灵魂拷问”&#xff0c;每个人读研的原因不同&#xff0c;有人因为职业瓶颈&#xff0c;有人晋升需要&#xff0c;还有人为了完成曾经的读研梦想&#xff1b;读书深造是一种经历&#xff0c;不光是学历的加持&#xff0c;我们…

API Testing v0.0.14 新增 gRPC, tRPC 协议的支持

api-testing 本次版本发布中的内容中&#xff0c;包含了两位高校同学的 contribution&#xff0c;其中屈晗煜在GitLink编程夏令营&#xff08;GLCC&#xff09;活动期间非常给力地增加了gRPC 协议的支持。 atest 版本发布 v0.0.14 atest 是一款用 Golang 编写的、开源的接口测试…

Vue3最佳实践 第八章 ESLint 与 测试 ( Jest )

Jest 测试 Vue 组件 ​在前端项目开发过程中&#xff0c;有很多时候也会要进行测试工作。本文将重点介绍如何利用 JavaScript 测试框架 Jest 进行高效的测试。Jest 是由 FaceBook 开发的顶级测试框架之一&#xff0c;广受开发者们的欢迎和信赖。在接下来的内容中&#xff0c;我…

【Ubuntu 系统使用进入,自动进入base虚拟环境解决最全】

项目场景&#xff1a; 在Ubuntu上安装完anaconda后&#xff0c;发现每次打开终端后都会自动进入到base的虚拟环境中去&#xff0c;虽然在这些环境下使用问题不大&#xff0c;但一些软件的安装在虚拟环境下有影响。每次使用conda deactivate退出也很麻烦。 问题描述 安装玩之…

软件测试这些基本类型你知道吗

关于软件测试的类型&#xff0c;从不同角度来讲&#xff0c;可以分很多种&#xff0c;有时候甚至觉得软件测试是人类创造出来的最复杂的职业。。。 对一些常见的测试类型做了一个基本的文档总结&#xff0c;有些测试类型在之前的基础知识里面已经有所介绍&#xff0c;这里就没…

【Python爬虫+可视化】解析小破站热门视频,看看播放量为啥会这么高!评论、弹幕主要围绕什么展开

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 环境使用 Python 3.8 Pycharm 模块使用 import requests import csv import datetime import hashlib import time 一. 数据来源分析 明确需求 明确采集网站以及数…

Linux Spug自动化运维平台公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

Unity HoloLens 2 应用程序发布

设置3D 启动器画面&#xff0c;glb格式的模型 VS中可以直接生成所有大小的图标

C++:快速入门篇

C:.cpp(面向对象) C语音&#xff1a;.c(面向过程)是为了弥补C的不足 命名冲突&#xff1a; 1.写的跟库冲突 2.自己写的互相冲突 1.命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff…

mysql扩展语句

&#xff08;一&#xff09;复制表和删除表 &#xff08;二&#xff09;临时表 &#xff08;三&#xff09;mysql的六种约束方式 主键约束 primary key 用于唯一标识表中的每一行&#xff0c;主键列的值必须是唯一而且不能为空&#xff0c;一个表只能有一个主键 外键约束 for…