一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情
前言
工作也有段时间了,工作中使用MySQL数据库极多,但是愈发感觉自己对MySQL的使用和理解还停留在很基础的层面,使用打算利用两个月重学学习一下MySQL,对于已经了解的进行巩固,进一步加深理解,对于没接触过的更加要上心,工作之后才更加明白学习的目的是为了什么!更加清除学习的方向是什么! 正文
分支结构
上篇讲到存储过程与存储函数,但是还只是很单调的几乎没有逻辑的查询操作,MySQL的分支结构类比Java的 if else、switch case等条件语法。
1.if else
第一个分支结构就是if else,和java里的 if else 语义一样,只不过在语法方面有些不同,还是结合上篇的存储过程使用,加深理解。
调用返回结果,可以看到根据我们的入参输出了正确的分支结果
2.case when
第二个分支结构 case when,这里和java的switch case 语义非常类似,但是MySQL里的case when有两种语法
- when 后面跟表达式 expression
2.when 后面跟常量 constant
调用输出结果可以看到都可以正常输出分支结果。
循环结构
1.while do
循环结构,也是代码中最常见的逻辑体之一,第一个要介绍的是while do,这里类比java的while,也只是语法有些差异。
上面定义了一个循环体,定义了一个num变量记录循环次数,然后查询输出,执行看结果。
2.loop
loop类似死循环,需要配合标签leave,iterate使用,这里简单介绍下leave和java里的break相同,可以跳出指定的位置,iterate和java的continue相同,可以再次从开头进入指定的位置。
执行可以发现结果正确,当循环次数大于10的时候leave会跳出到指定的位置结束了loop循环。
下面再看下iterate的使用
当num小于15时会一直重新进入执行+1操作,直到15才会退出循环,这里可以很清楚的知道leave和iterate的使用和区别。
3.repeat
repeat和loop类似也是个死循环,只不过repeat自带一个until可以跳出循环,until和if的作用是一样的,满足条件自动退出循环。
当count在循环10次后会被until条件拦截退出循环,我们看输出结果
下面我们来稍微结合一下使用上面的结构
定义了一个class_id变量用来接受值输出,while do循环前定义了一个leave的标签,当class_id = 1100会跳出循环,否则会一直 +1 ,我们调用执行下。
游标
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用来记录循环次数,然后输出,我们执行下看结果。
可以看到id为99 的记录名称相同,执行正确。
总结
根据上篇的存储过程和存储函数,以及本文的分支结构if else、case when,循环结构while do、loop、repeat,标签leave、iterate,以及游标cursor我们对工作中一般的使用场景应该是足以完成,在面对业务逻辑时,只需要和写java代码一样将这些语法套入其中即可,希望大家后遇到存储过程、存储函数的需求不在心虚。