用存储过程、定时器、触发器来解决数据分析问题

news2025/4/9 9:57:11

做数据分析或者数据处理,我们也需要掌握这些技能,来解决特定的业务问题。比如:做自动化报表,如果数据需要每天实时更新(增量爬虫)、定时计算某个业务指标 、想要实时监控数据库表中的数据增、删、改情况等。

文章大纲

一、存储过程

1、啥是存储过程,有什么用?

  • 过程 :将若干条 SQL 语句封装起来,起个名字

  • 存储过程 : 我们将此过程存储在数据库中,有点类似于编程中用到的函数,区别是函数有返回值,而过程没有返回值,相同点是将代码封装可复用,可传参,调用即可执行。

  • 好处:① 代码封装可复用 ② 可以接收、返回参数 ③ 减少网络交互、提升效率

2、存储过程如何使用

创建

create procedure 名称()
begin
  sql语句;
end

查看

show procedure status;

调用

call 名称();
 

删除

drop procedure if exists 名称;

3、存储过程中的变量

变量的种类和定义

在 SQL 中变量分为两种:

  • ① 系统变量:@@

  • ② 自定义变量:@

存储过程是可以编程的,意味着可以使用变量、表达式、控制结构,在存储过程中,声明变量用 declare

格式:declare 变量名 变量类型 【default 默认值】

变量运算与控制结构

变量的赋值,有两种方式:

  • ① set 变量名 = 值

  • ② set 变量名 := 值

if | else 控制结构语法格式

if  条件1 then
  sql 语句;
else if 条件2 then
  sql 语句;
else
  sql语句;
end if

存储过程中的参数传递

为了让存储过程更加灵活,可以传递参数,参数分为三种:

  • ① in:参数作为输入,调用时传入

  • ② out:参数作为输出,可以作为返回值

  • ③ inout:参数即可传入又可输入

格式: in|out|inout 参数名 参数类型

存储过程中使用循环

while 循环格式:

while 条件 do
  sql 语句;
end while

打印 1 - 100 之和

带输入参数n,求1-n之和

要求带输入参数 n,和输出参数 total ,求1-n 之和

要求 age 既是输入又是输出变量,传入一个年龄,就增加 20

二、定时器

1、啥是定时器,怎么用?

所谓定时器,就是定时地去运行指定的函数和代码,MySQL 的定时器就是 MySQL 的事件。

在开发过程中经常会遇到这样一个问题:每天或每月需定时去执行一条 SQL 语句或更新或删除数据。在我不了解 MySQL 定时器时,是用 Python 程序代码去操作数据表,再将 Python 程序,放到服务器跑定时任务。现在用定时器,完全可以在数据层面操作了,非常方便。

语法结构

create event [if not exists] 事件名
[definer = user] 可选参数。执⾏事件的⽤⼾,不指定默认就是当前⽤⼾
on schedule 定时时间设置。定义事件执⾏的频率,可以指定具体时间也可以周期性执行
[on completion [not] preserve ] 可选参数。默认是not,表⽰时间过期后会⽴即删除(注意不是不激活);on completion preserve 表⽰时间过期后会继续保留
[enable | disable | disable on slave] 可选参数。默认enable。事件激活、不激活、从服务上不激活(事件在主服务商创建并赋值到从服务器上,仅在主服务上执行)
[comment "注释"] 可选参数。
do 事件内容 定义事件的sql语句,如果语句有多⾏需要⽤ begin end 括起来

指定时间定时执行

at子句:这里要求是timestamp时间格式,⼀般格式是“时间点 + interval 时间单位”。表示在什么时间节点执行,例如:current_timestamp + interval 2 minute

要求:两分钟后往 event_test 表插⼊⼀条语句"事件启动了"

注意:因为参数默认是 on completion not preserve,事件运行完成后会自动删除

周期时间定时执行:

  • every子句:格式是“数字+时间单位”,表示时间周期,例如:1 hour / 2 minute / 3 second

  • starts子句:可选,跟上 timestamp 值,表示事件开始的时间点,如果没有指定就是当前时间

  • ends子句:可选,跟上 timesatamp 值,表示停止执行的时间,如果没有ends表示无限执行

要求:新建数据表 event_test,每分钟往里面插⼊⼀条数据,到 5 分钟结束

注意事项

1、需要激活事件,事件才会被执行,show events才可以查看。⼀个是全局参数开启,⼀个是事件的开启

SET GLOBAL event_scheduler = 1;
设置事件的状态为 enable:
ALTER EVENT event_name ON COMPLETION PRESERVE ENABLE; 开启
ALTER EVENT event_name ON COMPLETION PRESERVE DISABLE; 关闭

2、关掉了 navicat,事件不会关闭,关闭了 MySQL 服务器才会被关闭
3、多语句执行的时候,可能需要修改结束分隔符,比如:delimiter $
4、如果事件的开始时间已经过去了,虽然创建语句不会报错,但是事件不会被创建以及执行
5、事件⾥⾯不能嵌套事件,但是存储过程里面可以使用事件
6、在事件中使用 select、show 等返回结果语句没有意义,但是可以用 select into、insert into 等存储结果的语句
7、注意不要短周期内重复事件调度,不然数据会有问题。例如每分钟执行 100w 行数据,那这个会有问题,如果实在是需要那这个时候可以使用行锁、表锁来进行
8、事件⽆法传递参数,但是可以用事件里面的参数使用存储过程

定时器可以结合存储过程

现在用定时器,就可以在数据层面操作,定时去执行sql 语句或一组 sql 语句(存储过程),设置好定时任务,可通过 navicat —— 其它——事件,查看到当前事件的定义,计划,当然也可以手动完成上述操作。

三、触发器

1、啥是触发器,应用场景是?

触发器是一类特殊的事务,可以监视数据操作(数据表的变更日志),包括 insert | update | delete,并触发相关操作 insert | update | delete,运用触发器,不仅能简化程序,又可以增加程序的灵活性。

应用场景①:当向一张表中添加或删除数据时,需要在相关表中进行同步操作,比如:当一个订单产生时,订单所购的产品的库存量相应减少。

应用场景②:当表中某列数据的值与其他表中的数据有联系时,比如:某客户进行欠款消费,可以在生成订单时,设计触发器判断该用户的累计欠款是否超过最大限度。

应用场景③:跟踪某张表时,比如当有新订单产生时,需通知相关人员进行处理,这时可以在订单表中添加触发器加以实现。

2、触发器如何使用

创建

触发器只支持行级触发(每一行受影响,触发器都执行,叫作行级触发器),不支持语句级触发。

Create trigger 触发器名称
before/after  
insert/update/delete
on 表名 for each row #行级触发器
Begin 
    trigger_state;
end

查看

Show triggers;

删除

Drop trigger 数据库.触发器名称;

要求:现有商品表 goods,订单表 orders,当下一个订单时,商品要相应减少(买几个商品,就少几个库存), 分析如下:

  • 监视谁:orders

  • 监视动作:insert

  • 触发时间:after

  • 触发事件:update

CREATE TABLE goods(gid INT,name VARCHAR(10),num SMALLINT);
CREATE TABLE ord(oid INT ,gid INT, buy_num SMALLINT)
INSERT INTO goods VALUES (1,'cat',20),(2,'dog',90),(3,'pig',26);

查看商品表

创建触发器并查看

发现这样写触发器并不灵活

3、触发器引用行变量

使用别名 old、new 来引用触发器中发生变化的记录内容。注意:

引用行变量

要求:删除一个订单时,商品要退回,库存量要还原(删)

要求:订单表中的数量3 要求改到2,并且让商品表的库存量也变化(改)

要求:假如现在剩余 26 只pig,但是客户下订单买27只,能否预防,能否将buy_num > num 时,将buy_num 自动改为 num(深入理解before 和after的区别)

上面跟大家介绍了,如何数据分析工作中,应用 MySQL 的存储过程、定时器、触发器来实现自动化更新数据。当然,用 Python 或其他编程语言也能实现,个人认为在数据层面操作,更加简单、高效、稳定。具体还要看你当下的业务场景。希望通过本文能为你提供一个解决问题的思路。

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

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

相关文章

四万字总结Redis语法、配置、实战

文章目录一、安装1.Linux下安装下载解压安装修改配置设置环境变量启动、连接查看redis进程退出2.windows下安装下载并解压二、系统管理1.常用key相关的命令2.时间相关命令3.设置相关命令CONFIG GET & CONFIG SET4.查询信息5.密码设置三、基本数据类型1.Redis strings2.Redi…

Golang常用结构源码01-Map

Golang集合源码-Map 22届211本科,在字节实习了一年多,正式工作了半年,工作主要是golang业务研发,go语言使用和生态比java简洁很多,也存在部分容易遇见的问题,常用结构需要对其底层实现略有了解才不容易写出…

小程序学习笔记

注册小程序账号 www.mp.weixin.qq.com 获取appid 微信开发者工具下载 https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 设置代理和外观 创建小程序项目 小程序项目结构 app.json文件 这个文件的第一个路径就是小程序的默认页面 window配置项 …

使用kettle同步全量数据到Elasticsearch(es)--elasticsearch-bulk-insert-plugin应用

背景 为了前端更快地进行数据检索,需要将数据存储到es中是一个很不错的选择。由于公司etl主要工具是kettle,这里介绍如何基于kettle的elasticsearch-bulk-insert-plugin插件将数据导入es。在实施过程中会遇到一些坑,这里记录解决方案。 可能…

Java集合类ArrayList应用 | 二维数组的集合类表示与杨辉三角实现

目录 一、题干 🔗力扣:118. 杨辉三角 二、题解 1. 思路 2. 完整代码 三、总结 一、题干 🔗力扣:118. 杨辉三角 二、题解 1. 思路 我们知道杨辉三角的规律是: 每一行的第一列和它的最后一列上的数均为1.除此之…

如何在实验室服务器上跑代码

1.工具准备 可以下载一个xshell或secureCRT或者其他shell工具,通过ssh方式连接服务器,然后通过本地电脑终端控制服务器。连接方式输入主机(Host),和端口号(一般是22)就行了。如下图 连接成功后就可以在本…

java面试题每日10问(1)

1.What is Java? Java is object-oriented, platform-independent, Multithreaded, and portable programming language.it provides its own JRE and API. 2.What is the difference between JDK, JRE, and JVM? JVM Java Virtual Machine provides the runtime environm…

返乡做县城跑腿平台困难吗?都有哪些需求要点需要掌握?

自2020年受疫情影响以来,大家对跑腿服务有了更全新的认识。跑腿的便利性和及时性让跑腿行业蓬勃发展。现如今全面开放之际,跑腿用户总数也将突破新高,其跑腿市场也将迎来快速发展期。 据统计,国内配送市场规模已超过400亿单&…

springmvc 请求转换为MultipartFile的过程

前言: 最近在研究文件上传的问题,所以就写下这个博客,让大家都知道从流转换为MutipartFile的过程,不然你就知道在方法中使用,而不知道是怎么样处理的,是不行的 从DiaspatherServlet说起: 别问为啥,去了解tomcat和servlet的关系,我后面会 写这篇博客的 servlet的生命周期 ini…

JVM内存结构简介

一、java代码编译执行过程 1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 2.类加载:通过ClassLoader及其子类来完成JVM的类加载 3.类执行:字节码被装入内存,进入JVM虚拟机&#xff…

Linux 计算机网络从零到一开始构建 必看

Linux 计算机网络从零到一开始构建 在整个互联网中,计算之间的沟可能通需要跨越千山万水,层层加密解码。当前我们就来尝试粗浅剖析一下整个计算机网络的形成。 形成与起源 从现在回头看之前的网络形成过程,其实对应的就是我们的网络多层架…

为了让自己心情愉悦,我用python把美妞得图片制成了GIF设置桌面

前言 大家早好、午好、晚好吖 ❤ ~ 要想生活过的去,每天美女必然少不了~ 每天看美女,只为了愉悦心情,心情好了,才长寿。 于是怀揣着愉悦心情的想法,我开始制作GIF动图生成器 这个小工具制作的目的是为了将多张图片组…

舵机的控制

舵机的信号线是做为输入线就是接收PWM信号(定时器产生)。 一般PWM的周期是20ms,那么对应的频率是50hz。那么改变不同的占空比就可以控制转动的角度。 其中占空比从0.5-2.5ms(如果占空比大于2.5ms也只会在最大角度。),相…

Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

下载地址:Node.jsMySQL开发的B2C商城系统源码数据库(微信小程序端服务端) NideShop商城(微信小程序端) 界面高仿网易严选商城(主要是2016年wap版)测试数据采集自网易严选商城功能和数据库参考ecshop服务端api基于&am…

php学习笔记-代码基本语法-day01

php代码基本语法 PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

一些微信使用小技巧分享

技巧一:检测僵尸粉 微信好友过多,我们可以通过创建群聊来检测好友。点击右上角图标,选择【发起群聊】,勾选需要检测的好友,点击【完成】。能进群的都是朋友关系,不能进群的会删或者拉黑你。不过需要注意的是…

VS2022点云库PCL1.12配置过程中遇到的一些奇葩问题

最近处于换工作的间歇期,原来配置的电脑交公了,各种程序数据都做了搬家。对这些程序重新配置,可以说是一地鸡毛。系统对不上,各个开源库版本一团乱麻,尤其是配置PCL库的时候,遇到了各种奇奇怪怪的问题&…

二十八、Docker (4)

🌻🌻 目录一、Dockerfile入门1.1 Dockerfile 常用命令1.2 Dockerfile 搭建 jdk 环境1.3 Dockerfile 搭建 tomcat 环境镜像1.4 Dockerfile 创建微服务 java 镜像二、使用Nexus搭建Docker镜像私有仓库2.1 安装 Nexus2.2 访问配置 Nexus2.3 配置 Docker 服务…

自动驾驶助力智慧港口建设,景联文科技提供数据标注服务

“在无人集卡出现以前,岸桥式起重机需要把停靠在岸边的船舶上数百个集装箱全部吊起,放到一旁的集装箱卡车上,运向堆场,等待集装箱卸货后再进行下一次往返工作。为保证工作效率,需要上百位司机驾驶着集卡在港口中来回往…

拉伯证券|磷酸铁锂电池在储能市场的应用有哪些?

时隔四个月,中国有色金属工业协会硅业分会重启硅料报价。本周,单晶复投料成交均价为17.82万元/吨,单晶细密料成交均价为17.62万元/吨。综合其他组织报价数据,硅料已全线跌破20万元/吨,作为对比,上一年10月底…