重学MySQL之分支结构&循环结构&游标

164 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

前言

工作也有段时间了,工作中使用MySQL数据库极多,但是愈发感觉自己对MySQL的使用和理解还停留在很基础的层面,使用打算利用两个月重学学习一下MySQL,对于已经了解的进行巩固,进一步加深理解,对于没接触过的更加要上心,工作之后才更加明白学习的目的是为了什么!更加清除学习的方向是什么! 正文

分支结构

上篇讲到存储过程与存储函数,但是还只是很单调的几乎没有逻辑的查询操作,MySQL的分支结构类比Java的 if elseswitch case等条件语法。

1.if else

第一个分支结构就是if else,和java里的 if else 语义一样,只不过在语法方面有些不同,还是结合上篇的存储过程使用,加深理解。

image.png

调用返回结果,可以看到根据我们的入参输出了正确的分支结果

image.png

2.case when

第二个分支结构 case when,这里和java的switch case 语义非常类似,但是MySQL里的case when有两种语法

  1. when 后面跟表达式 expression

image.png

2.when 后面跟常量 constant

image.png

调用输出结果可以看到都可以正常输出分支结果。

image.png

循环结构

1.while do

循环结构,也是代码中最常见的逻辑体之一,第一个要介绍的是while do,这里类比java的while,也只是语法有些差异。

image.png

上面定义了一个循环体,定义了一个num变量记录循环次数,然后查询输出,执行看结果。

image.png

2.loop

loop类似死循环,需要配合标签leave,iterate使用,这里简单介绍下leave和java里的break相同,可以跳出指定的位置,iterate和java的continue相同,可以再次从开头进入指定的位置。

image.png

执行可以发现结果正确,当循环次数大于10的时候leave会跳出到指定的位置结束了loop循环。

image.png

下面再看下iterate的使用

image.png

当num小于15时会一直重新进入执行+1操作,直到15才会退出循环,这里可以很清楚的知道leave和iterate的使用和区别。

image.png

3.repeat

repeat和loop类似也是个死循环,只不过repeat自带一个until可以跳出循环,until和if的作用是一样的,满足条件自动退出循环。

image.png

当count在循环10次后会被until条件拦截退出循环,我们看输出结果

image.png

image.png

下面我们来稍微结合一下使用上面的结构

image.png

定义了一个class_id变量用来接受值输出,while do循环前定义了一个leave的标签,当class_id = 1100会跳出循环,否则会一直 +1 ,我们调用执行下。

image.png

游标

1.cursor

游标类似java的for循环,fetch 就是 for循环里的 第i个值,直接看代码。

delimiter //
create procedure test_cursor(in sumCount int(11),out cName varchar(50),out num int(11))
begin

	declare class_id int(11) default 1;
	declare class_name varchar(50) default "掘金~";
	declare count int(11) default 1;
	
	declare class_cursor cursor for
	select id,className from class limit sumCount; -- 声明游标并赋值
	
	open class_cursor; -- 打开游标
	
	cursor_label:loop
	
		fetch class_cursor into class_id,class_name; -- 获取数据,一条条遍历
		set count = count + 1;
		
		if class_id = 99 then
			set cName = class_name;
			set num = count;
			leave cursor_label;
		end if;
		
	end loop cursor_label;
	
	close class_cursor; -- 关闭游标
	
end //
delimiter ;

简单说下这里的内容,定义了三个内部变量,calss_id、calss_name用来接收fetch的值,count用来记录循环次数,然后输出,我们执行下看结果。

image.png

image.png 可以看到id为99 的记录名称相同,执行正确。

总结

根据上篇的存储过程和存储函数,以及本文的分支结构if elsecase when,循环结构while dolooprepeat,标签leaveiterate,以及游标cursor我们对工作中一般的使用场景应该是足以完成,在面对业务逻辑时,只需要和写java代码一样将这些语法套入其中即可,希望大家后遇到存储过程、存储函数的需求不在心虚。