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

news2024/9/21 13:34:01

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

存储过程

1.介绍

​ 存储过程是事先经过编译并存储是数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

​ 存储过程思路上很简单,就是数据库SQL语言层面的代码封装与重用。

请添加图片描述

特点

  • 封装,复用
  • 可以接受参数,也可以返回数据
  • 减少网络交互,效率提升

2.存储过程语法

1.创建

注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符

delimiter 结束符(默认为;
create procedure 存储过程名称([参数列表])
begin
	--SQL列表;
end;

2.调用

call 名称 ([参数]);

3.查看

select * from information_schema.routines where routine_schema = 'xxx' --查询指定数据库的存储过程及状态信息
show create procedure 存储过程名称; --查询某个存储过程的定义

4.删除

drop procedure [if exists] 存储过程名称;

3.变量

系统变量是MySQL服务器提供的,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL),会话变量(SESSION)。

1.查看系统变量

show [session|global] variables; --查看所有系统变量
show [session|global] variables like '%'; --可以通过like模糊匹配方式查找变量
select @@[session|global] 系统变量名; --查看指定变量值

2.设置系统变量

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 ...];
变量类型:intbigintcharvarchardatetime等。

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;

before:在操作之前触发
after:操作之后触发
insert/update/delete:操作类型

2.查看当前数据库的触发器

show triggers;

3.删除

drop trigger [schema_name.]trigger_name;  --如果没有指定schema_name,默认为当前数据库

例子:
请添加图片描述

7.总结

1.视图(view)

  • 虚拟存在的表,不保存查询结果,只保存查询的SQL逻辑
  • 简单,安全,数据独立

2.存储过程(procedure)

  • 事先定义并存储在数据库中的一段SQL语句的集合。
  • 减少网络交互,提高性能,封装重用
  • 变量,if,case,参数(in/out/inout),while,repeat,loop,cursor,handler

3.存储函数(function)

  • 存储函数是有返回值的存储过程,参数类型只能为in类型
  • 存储函数可以被存储过程替代

4.触发器(trigger)

  • 可以在表数据进行insert,update,delete之前或之后触发

3.删除

drop trigger [schema_name.]trigger_name;  --如果没有指定schema_name,默认为当前数据库

例子:
[外链图片转存中…(img-zcykqyUF-1682569241841)]

7.总结

1.视图(view)

  • 虚拟存在的表,不保存查询结果,只保存查询的SQL逻辑
  • 简单,安全,数据独立

2.存储过程(procedure)

  • 事先定义并存储在数据库中的一段SQL语句的集合。
  • 减少网络交互,提高性能,封装重用
  • 变量,if,case,参数(in/out/inout),while,repeat,loop,cursor,handler

3.存储函数(function)

  • 存储函数是有返回值的存储过程,参数类型只能为in类型
  • 存储函数可以被存储过程替代

4.触发器(trigger)

  • 可以在表数据进行insert,update,delete之前或之后触发
  • 保证数据完整性,日志记录,数据校验

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

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

相关文章

SR常用数据集介绍

1.Download Link&#xff1a; 1.DIV2K: DIV2K Dataset 2.Set5:【实践与问题解决28】最全超分辨率&#xff08;SR&#xff09;数据集介绍以及多方法下载链接_超分辨率数据集_呆呆象呆呆的博客-CSDN博客 3.Set14:【实践与问题解决28】最全超分辨率&#xff08;SR&#xff09;数…

Java --- springboot2的静态资源配置原理

目录 一、静态资源配置原理 1.1、配置类只有一个有参构造器 1.2、资源处理的默认规则 1.3、欢迎页的处理规则 一、静态资源配置原理 springboot启动默认加载xxxAutoConfiguration(自动配置) springmvc功能的自动配置类&#xff0c;生效 Configuration(proxyBeanMethods …

Find My资讯|苹果iOS 17将增强Health应用、引入情绪追踪器

彭博社的马克・古尔曼表示&#xff0c;苹果计划在 iOS / iPadOS 17 系统中&#xff0c;为 iPhone / iPad 用户引入几项和健康相关的新功能。其中最值得关注的一款新应用&#xff0c;可以追踪用户的情绪。 苹果计划进一步增强 Health 应用&#xff0c;引入视力状况相关的功能。…

Python小姿势 - # Python网络爬虫之如何通过selenium模拟浏览器登录微博

Python网络爬虫之如何通过selenium模拟浏览器登录微博 微博登录接口很混乱&#xff0c;需要我们通过selenium来模拟浏览器登录。 首先我们需要安装selenium&#xff0c;通过pip安装&#xff1a; pip install selenium 然后我们需要下载一个浏览器驱动&#xff0c;推荐使用Ch…

【翻译一下官方文档】认识uniCloud云数据库(基础篇)

我将用图文的形式&#xff0c;把市面上优质的课程加以自己的理解&#xff0c;详细的把&#xff1a;创建一个uniCloud的应用&#xff0c;其中的每一步记录出来&#xff0c;方便大家写项目中&#xff0c;做到哪一步不会了&#xff0c;可以轻松翻看文章进行查阅。&#xff08;此文…

虹科活动丨2023第十三届药品质量安全大会精彩回顾

由中国社会科学院食品药品产业发展与监管研究中心、北京中培科检信息技术中心联合主办的2023第十三届&#xff08;春季&#xff09;全国药品质量安全大会暨展览会圆满结束&#xff0c;会上众多优秀企业齐聚一堂&#xff0c;分享独家产品&#xff0c;交流行业知识。 在生物科学…

vCenter(PSC)正常更改或重置administrator@vsphere.local用户的密码方法

1. 正常更改administratorvsphere.local用户密码 在vCenter界面中选择“菜单”下的“系统管理”&#xff0c;如下图所示&#xff1a; 然后在Single Sign On下的用户和组中&#xff0c;选择“vsphere.local”域&#xff0c;再对Administrator用户进行编辑&#xff0c;即可进行…

一图看懂 certifi 模块:证书路径, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 certifi 模块&#xff1a;证书路径, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图及类关系图类关系图模块全展开【certifi】统计常量模块1 certifi.core 函数2 co…

【c语言】详解宏定义#define 各种使用方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

vue+Nodejs+Koa搭建前后端系统(三)--koa-generator项目优化修改

前言 计算机系统为Windows 10 专业版 修改package.json配置 原package.json文件中scripts字段的配置字段为&#xff1a; 在终端运行 npm run dev可能会报错 ‘.’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决方法就是修改package.json文件中dev…

Apache Zeppelin系列教程第一篇——安装和使用

一、Apache Zeppelin 介绍 Apache Zeppelin是一种开源的Web笔记本类型交互式数据分析工具&#xff0c;它提供了基于浏览器的界面&#xff0c;允许数据工程师和科学家通过各种语言和工具&#xff0c;如Scala, Python, SQL, R,等等&#xff0c;交互式地进行数据分析、可视化以及…

Word控件Spire.Doc 【脚注】字体(2): 在C#, VB.NET中设置Word字体

Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

执行kubectl命令失败server was refused问题解决

在宿主机上执行kubectl 命令时&#xff0c;出现如下错误 [rootroot ~] kubectl get namespaces The connection to the server xxx.xx.xx.xx:6443 was refused - did you specify the right host or port? 然后再网上找寻解决方案&#xff0c;发现各种各样的解决方案都存在。…

API淘宝数据接口

如果你想在自己的应用中使用淘宝的数据&#xff0c;那么对接淘宝数据接口是必不可少的一步。本文将介绍如何对接API淘宝数据接口&#xff0c;以便你能够顺利获取和使用淘宝的数据。 步骤一&#xff1a;​​获取App Key和App Secret​​ 首先&#xff0c;在淘宝开放平台申请AP…

深入浅出:CAN通信之CCP协议

CCP(CAN Calibration Protocol) CAN标定协议(用于标定系统与ECU之间的通信) CCP协议在应用层&#xff0c;使用CAN的数据帧来传输命令 CRO数据帧(主设备想从设备发送) CRO报文&#xff1a;CCP报文帧格式为CMD CTR DATA&#xff0c;即Command、Counter、Data&#xff0c;其中…

opencv cuda版本windows编译

目录 1. 编译准备2. 编译3. 遇到的问题及解决方案3.1 boostdesc_bgm.i,vgg_generated_48.i等文件的缺失3.2 fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录 1. 编译准备 编译工具是cmakevisual studio2022&#xff0c;首先安装这两个工…

6个优化策略,助你降低K8S成本

Kubernetes 早已成为容器编排引擎的事实标准&#xff0c;而随着 Kubernetes 环境的复杂性持续增长&#xff0c;成本也在不断攀升。CNCF 发布的调查报告《Kubernetes 的 FinOps》显示&#xff0c;68%的受访者表示 Kubernetes 开销正在上涨&#xff0c;并且一半的人所在的组织经历…

WebSocket 详解

WebSocket WebSocket 是一种支持双向通讯网络通信协议。意思就是服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息属于服务器推送技术的一种. 特点&#xff1a; &#xff08;1&#xff09;建立在 TCP 协议之上&#xff0c;服务器端的实现比较容…

【MATLAB数据处理实用案例详解(13)】——利用Elman网络实现上证股市开盘价预测

目录 一、问题描述二、Elman网络预测上证股市开盘价原理三、算法步骤3.1 加载数据3.2 构造样本集3.3 划分训练集和测试集3.4 创建Elman神经网络3.5 网络训练3.6 测试 四、结果展示 一、问题描述 选择2005年6月30日至2006年12月1日的上证开盘价进行预测分析。数据保存在elm_sto…

制冷暖通工业互联网平台服务商

制冷暖通工业互联网平台服务商可以提供以下服务&#xff1a; 系统架构设计&#xff1a;根据客户需求&#xff0c;制定适合的系统架构和技术路线&#xff0c;提供全面的技术咨询和方案设计服务。 平台开发和定制化&#xff1a;根据客户需求和系统设计&#xff0c;进行平台开发和…