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

文章目录

    • 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.mfbz.cn/a/110382.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

安防监控项目---web点灯(网页发送命令控制A9的led)

文章目录 前言一、web点亮LED流程二、静态网页设计&#xff08;html界面&#xff09;三、 CGI和BOA在本项目中的使用总结 前言 书接上期&#xff0c;和大家分享的是web点灯&#xff0c;哈哈哈&#xff0c;谈论起点灯这个词&#xff0c;这么久以来我已然已经成长为一名合格的点…

JVM(Java Virtual Machine)G1收集器篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;本文主要介绍G1收集器的收集思想和具体过程&#xff08;填上一篇文章留下的坑&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&#xff09;内存模型篇 JVM&#xff08;Java Virtual Machi…

网络安全中常见的问题和隐患

网络安全是当今数字化世界中的一个重要问题&#xff0c;各种隐患和威胁不断涌现。其中&#xff0c;IP地址与网络安全之间有着密切的联系。本文将讨论网络安全中常见的问题和隐患&#xff0c;以及如何通过查询IP地址来解决一些与之相关的问题。 常见网络安全问题和隐患 1. 黑客…

ceph高可用

配置基础环境 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config 安装基础环境 然后安装ceph的密钥&#xff0c;centos7和8都要执行&#xff0c;下面不特别说明都是c…

C#,数值计算——分类与推理Svmpolykernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmpolykernel : Svmgenkernel { public int n { get; set; } public double a { get; set; } public double b { get; set; } public double d { get; set; …

CPU架构之x86解读

一&#xff0e;什么是x86架构 X86架构&#xff1a;是微处理器执行的计算机语言指令集&#xff0c;指一个intel通用计算机系列的标准编号缩写&#xff0c;也标识一套通用的计算机指令集。 二、x86架构的优势 技术成熟&#xff1a;x86架构的芯片经过多年的发展&#xff0c;已经…

目标检测 YOLOv5 预训练模型下载方法

目标检测 YOLOv5 预训练模型下载方法 flyfish https://github.com/ultralytics/yolov5 https://github.com/ultralytics/yolov5/releases 可以选择自己需要的版本和不同任务类型的模型 后缀名是pt

AR眼镜安卓主板,智能眼镜光机方案定制

AR智能眼镜是一项涉及广泛技术的创新产品&#xff0c;它需要考虑到光学、显示、功耗、散热、延迟、重量以及佩戴人体工学等多个方面的因素&#xff0c;每一个项目都是技术进步所需攻克的难题。 在本文中&#xff0c;我们将重点讨论AR眼镜的主板和光学方案。 首先是AR智能眼镜的…

优化改进YOLOv5算法:加入SPD-Conv模块,让小目标无处遁形——(超详细)

1 SPD-Conv模块 论文:https://arxiv.org/pdf/2208.03641v1.pdf 摘要:卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而,当图像分辨率较低或物体较小时,它们的性能会灾难性下降。这是由于现有CNN常见的设计体系结构中有缺陷,即使用卷积…

【Go入门】GO流程与函数介绍(代码运行逻辑控制)

流程和函数 这小节我们要介绍Go里面的流程控制以及函数操作。 流程控制 流程控制在编程语言中是最伟大的发明了&#xff0c;因为有了它&#xff0c;你可以通过很简单的流程描述来表达很复杂的逻辑。Go中流程控制分三大类&#xff1a;条件判断&#xff0c;循环控制和无条件跳…

【教3妹学编辑-算法题】H 指数 II

3妹&#xff1a;2哥早啊&#xff0c; 新的一周开始了&#xff0c;奥利给&#xff01;&#xff01;&#xff01; 2哥 :3妹&#xff0c;今天起的很早嘛&#xff0c;精神也很饱满。 3妹&#xff1a;昨天睡的早&#xff0c;早睡早起好身体&#xff01; 2哥&#xff1a;既然离时间还…

云服务器的先驱,亚马逊云科技海外云服务器领军者

随着第三次工业革命的发展&#xff0c;移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中&#xff0c;不少优秀的云服务器产品发挥了不可低估的作用&#xff0c;你或许听说过亚马逊云科技、谷歌GCP、IBM Cloud等优秀的海外云服务器。那么云服务器有哪些&…

Xcode15 模拟器 Rosetta 模式

打开Xcode15的方式其实没有Rosetta 选项了&#xff0c;但是可以跑Xcode默认Rosetta 模拟器。在xcode中如下方式打开&#xff1a; Product -> Destination -> Destination Architectures -> 打开Show Rosetta Destinations 然后用这些带Rosetta的模拟器运行&#xff1…

【SVN内网穿透】实现远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

C++ 指针

*放在哪里&#xff1f; 如果声明一个变量&#xff1a;int* b; 如果声明多个变量&#xff1a;int a,*b,*c; nullptr c11中NULL的变形&#xff0c;是一个特殊值&#xff0c;可以赋给任意类型的指针&#xff0c;代表该指针指向为空。 this指针 this指针不是一个const Test*(…

深度学习(生成式模型)——DDIM:Denoising Diffusion Implicit Models

文章目录 前言为什么DDPM的反向过程与前向过程步数绑定DDIM如何减少DDPM反向过程步数DDIM的优化目标DDIM的训练与测试 前言 上一篇博文介绍了DDIM的前身DDPM。DDPM的反向过程与前向过程步数一一对应&#xff0c;例如前向过程有1000步&#xff0c;那么反向过程也需要有1000步&a…

算法通关村第四关-黄金挑战栈的经典问题

括号匹配问题 描述 : 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

Flume 快速入门【概述、安装、拦截器】

文章目录 什么是 Flume&#xff1f;Flume 组成Flume 安装Flume 配置任务文件应用示例启动 Flume 采集任务 Flume 拦截器编写 Flume 拦截器拦截器应用 什么是 Flume&#xff1f; Flume 是一个开源的数据采集工具&#xff0c;最初由 Apache 软件基金会开发和维护。它的主要目的是…