15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天_有序循环状态看触发器

set [session|global] 系统变量名 = 值;
set @@[session | global] 系统变量名 = 值;

注意:

  • 如果没有指定session/global,默认是session,会话变量。
  • MySQL服务重新启动之后,所有设置的全局参数会失效,要不想失效,可以在/etc/my.cnf中配置
3.用户变量

​ 用户定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”就可以。其作用域为当前连接。

赋值(在变量名前加一个@,两个为系统变量)

set @var\_name = expr [,@var\_name=expr];
set @var\_name := expr [,@var\_name:=expr];
select 字段名 into @变量名 from 表名;

使用

select @var\_name;

注意:
用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。

4.局部变量

​ 局部变量是根据需要定义的局部生效的变量,访问之前,需要declare声明。可用作存储内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end块中。

1.声明

declare 变量名 变量类型 [default ...];
变量类型:int,bigint,char,varchar,date,time等。

2.赋值

set 变量名=值;
select 字段名 into 变量名 from 表名;

4.判断/循环/多分支/游标
1.if判断

语法:

if 条件1 then
	...
elseif 条件2 then --可选
	...
else 			 --可选
	...
end if;

例子:

mysql> delimiter $
mysql> create procedure test() 
begin 
	declare sal int default 80; 
	declare result varchar(10); 
if sal>=90 then 
	set result='A'; 
elseif sal >=80 then 
	set result='B'; 
else 
	set result='C'; 
end if; 
select result; 
end;$
mysql> delimiter ;
mysql> call test;

2.参数
类型含义备注
in该类参数作为输入,也就是需要调用时传入值默认
out该类参数作为输出,也就是该参数可以作为返回值
inout既可以作为输入参数,也可以作为输出参数需要定义变量,进入参数之后进行加工,然后再进行返回

例子1:

mysql> delimiter $
mysql> create procedure test1(in sal int,out result varchar(10)) 
begin 
if sal>=90 then 
	set result='A'; 
elseif sal >=80 then 
	set result='B'; 
else 
	set result='C'; 
end if; 
end;$
mysql> delimiter ;
mysql> call test1(100,@result);
mysql> select @result;
+---------+
| @result |
+---------+
| A       |
+---------+
1 row in set (0.00 sec)

例子2:

mysql> delimiter $
mysql> create procedure test2(inout sal int) 
	begin set sal=sal\*0.5; 
end$
mysql> set @sal=100;
mysql> call test2(@sal);
mysql> select @sal$
+------+
| @sal |
+------+
|   50 |
+------+
1 row in set (0.00 sec)


3.流程控制(case)

语法一:

case case_value
	when when_value1 then statement_list1
	[when when_value2 then statement_list2]
	[else statement_list]
end case;

语法二:

case case_value
	when search_condition then statement_list1
	[when search_condition then statement_list2]
	[else statement_list]
end case;

请添加图片描述

create procedure quarter(in num int) 
begin 
case  
when num<=3 then 
	select '1'; 
when num<=6 then 
	select '2'; 
when num<=9 then 
	select '3'; 
when num<=12 then 
	select '4'; 
else 
	select 'error'; 
end case; 
end$

4.循环结构
1.while

while循环是有条件的循环控制语句,满足条件后,再执行循环体中的SQL语句,具体语法为:

#先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
while 条件 do
	SQL逻辑
end while;

例子n数的总分:

mysql> delimiter $
mysql> create procedure test1(in num int) 
begin 
	declare sum int default 0; 
while num>0 do 
	set sum=sum+num; 
	set num=num-1; 
end while; 
select sum; 
end$
mysql> delimiter ;
mysql> call test1(10);
+------+
| sum  |
+------+
|   55 |
+------+
1 row in set (0.00 sec)

2.repeat

​ repeat是条件的循环控制逻辑,先循环一次,然后判定逻辑是否满足,如果满足则退出,如果不满足,则进行下一次循环

repeat
	SQL逻辑
	until 条件
end repeat;

例子n数的总分:

mysql> delimiter $
mysql> create procedure test2(in num int)
begin
     declare sum int default 0;
     repeat
     set sum=sum+num;
     set num=num-1;
     until num<=0
     end repeat;
     select sum;
end$
mysql> delimiter ;
mysql> call test2(10);
+------+
| sum  |
+------+
|   55 |
+------+
1 row in set (0.00 sec)

3.loop

loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其实现简单的死循环。loop可以配合一下两个语句使用:

  • leave:配合循环使用,退出循环。
  • iterate:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
循环名:loop
	SQL逻辑
	leave 循环名
	iterate 循环名
end loop 循环名;

例子求0-n的偶数之和

create procedure test3 (in num int)
begin
	declare sum int default 0;
	test3:loop
	if num<=0 then
		leave test3;
	end if;
	
	if num%2=0 then
		set sum=sum+num;
	end if;
  set num=num-1;
	end loop test3;
	select sum;
end;

call test3(100);

5.游标

游标是用来存储查询结构集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明,open,fetch和close,其语法分别如下:
1.声明游标

declare 游标名称 cursor for 查询语句;

2.打开游标

open 游标名称;

3.获取游标记录

fetch 游标名称 into 变量[,变量];

4.关闭游标

close 游标名称;

例子:



6.条件处理程序

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时响应的处理步骤。具体语法为:

declare handler_action handler for condition_value [,condition_value] statement;

handler_action:
	continue:继续执行当前程序
	exit:终止执行当前程序

condition_value:
	sqlstate sqlstate_value:状态码,如02000;
	sqlwarning:所有以01开头的sqlstate代码的简写
	not found:所有以02开头的sqlstate代码的简写
	sqlexception:所有没有被sqlwarning或not found捕获的sqlstate代码的简写

例子:解决游标循环插入表列的情况

5.存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是in(输入)类型的。具体语法如下:

create function 存储函数名称([存储列表])
returns type [characteristic]
begin
	--SQL语句
	return ...;
end;

characteristic说明:
	deterministic:相同的输入参数总是产生相同的结果
	no sql:不包含SQL语言
	reads sql data:包含读取数据的语句,但不包含写入数据的语句

6.触发器
1.介绍

​ 触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句合集。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

​ 使用别名old和now来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发还只是支持行级触发,不支持语句级别触发。

触发器类型new和old
insert型触发器new表示将要或者已经新增的数据
update型触发器old表示修改之前的数据,new表示将要或已经修改后的数据
delete型触发器old表示将要或者已经删除的数据
2.语法

1.创建

create trigger trigger_name
before/after insert/update/delete
on tbl_name for each row --行级触发器
begin
	trigger_stmt;
end;


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/eb45a84278ab092960e44f8c91b6a5d6.png)
![img](https://img-blog.csdnimg.cn/img_convert/7316aeb9622fe2cbf8e61c719ac4934a.png)
![img](https://img-blog.csdnimg.cn/img_convert/b8efc4fd3e2817137984cc3ffb58730d.png)
![img](https://img-blog.csdnimg.cn/img_convert/20de04628dab6b2768f9f5e15c98f2a1.png)
![img](https://img-blog.csdnimg.cn/img_convert/b7ea8865aa29893cc15b4d657a28419f.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/4b6545f34a5d8030539e19384e6823c6.jpeg)



为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/6daa59e4089a3b1be68f185488063078.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/b152d8e7219c945a7c1f6e0fe13a3654.jpeg)

?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-uS3HsTLo-1712816565913)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值