【MySQL】MySQL存储过程与存储函数实战(MySQL专栏启动)

news2024/11/17 5:37:16

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 CSDN博客专家 | CSDN后端领域优质创作者 | CSDN内容合伙人 | 2022博客之星

🏆 InfoQ(极客)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻
        

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术

本文目录

本文目录

本文导读

一、存储过程与存储函数

1、什么是存储过程和存储函数

2、存储过程和存储函数的使用场景

3、存储过程和存储函数的优缺点

二、存储过程实战

1、创建存储过程

2、查看存储过程

3、修改存储过程

4、删除存储过程

三、存储函数实战

总结


本文导读

存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中供所有用户调用的子程序。它们预先编译并存储在数据库系统中。本文讲解全面讲解其特性与优缺点,并附以实战解析。

一、存储过程与存储函数

1、什么是存储过程和存储函数

存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中,供所有用户调用的程序(当用户通过指定存储程序的名字来调用才会执行),它们已经被预先编译并存储在数据库系统中。因此,调用存储过程和存储函数来完成业务逻辑可以提高性能。

与存储过程一样,存储函数是在数据库中定义的SQL语句的集合。存储函数可以通过return语句返回函数值,该语句主要用于计算和返回值。存储过程不直接返回值,主要用于执行操作(存储过程没有 return,通过 out 参数来指定返回值)。

在MySQL中,使用 CREATE FUNCTION 语句创建存储函数,使用 CREATE PROCEDURE 语句创建存储过程。

2、存储过程和存储函数的使用场景

存储过程有些开发规范中不推荐,同时对开发人员编写存储过程的要求稍高,但这并不影响存储过程的广泛使用。使用存储过程不仅可以提高数据库的访问效率,还可以提高数据库使用的安全性。

一般在执行SQL之前,需要编译常见数据库操作的SQL语句,这里面存储过程以另一种方式执行SQL语句。

存储过程是一种可编程函数,它是在数据库中创建和保存的,通常由SQL语句和一些特殊的控制结构组成。当您希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤其适用。

使用存储过程的目的是预先使用SQL语句编写常见或复杂的工作,并使用指定的名称存储。这个过程被编译、优化并存储在数据库服务器中,因此被称为存储过程。当数据库将来需要提供与定义的存储过程具有相同功能的服务时,只需调用“call存储过程名称”即可自动完成。

存储过程可用于转换数据、迁移数据和生成报告。它类似于编程语言。一旦成功执行,就可以随时调用它来完成指定的函数操作。

3、存储过程和存储函数的优缺点

存储过程的优点:

1、封装性:存储过程完成一个功能需要多个SQL语句,并且可以在语句之间传递参数。因此,编写逻辑函数相对更复杂。存储过程可以将这些SQL语句包含在一个独立的单元中,这样外部看不到复杂的SQL语句,只有简单的调用才能实现目标。数据库专业人员可以随时修改存储过程,而不会影响调用它的应用程序源代码。

2、灵活性:存储过程可以用过程控制语句编写,并且具有很强的灵活性来完成复杂的判断和更复杂的操作。

3、减少网络IO:存储过程在服务器端运行,执行速度很快。因此,当在客户端计算机上调用存储过程时,仅在网络中传输调用语句,这可以减少网络负载。

4、高性能:当存储过程被编译后存储在数据库服务器中,MySQL客户端可以直接调用它,这样所有SQL语句都将从服务器执行,从而提高性能。但是存储过程不是越多越好,过多使用存储过程将影响系统性能。

5、安全性:存储过程作为接口提供给外部程序

6、数据独立性:当数据表的结构发生变化时,不需要修改程序,只有需要重写存储过程。

存储过程的缺点:

1、调试很麻烦

2、存在迁移问题

3、重新编译问题,因为后端代码是在运行之前编译的。如果具有引用关系的对象发生更改,则需要重新编译受影响的存储过程和包

4、如果在程序系统中使用了大量存储过程,当程序交付使用时,数据结构将随着用户需求的增加而改变,随之而来的是系统的相关问题。如果想要维护系统,成本高且维护麻烦。

二、存储过程实战

1、创建存储过程

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名> <类型>

过程名:存储过程的名称。即 db_name.sp_name,尽量避免选择与MySQL内置函数相同的名称,否则将报告错误(建议使用业务名称)。

过程参数:存储过程可以没有参数(仍需要在存储过程的名称后面添加一对括号),也可以有一个或多个参数。MySQL存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,这些参数由三个关键字标识:IN、OUT和INOUT。其中,输入参数可以传递给存储过程,当存储过程需要返回操作结果时使用输出参数,而输入/输出参数可以同时用作输入参数和输出参数。

过程体:存储过程体,包含调用过程时必须执行的SQL语句。本节以关键字BEGIN开始,以关键字END结束。如果存储过程主体中只有一条SQL语句,则可以省略BEGIN-END标志。

-- DELIMITER 命令将结束命令修改为其他字符
-- 这个地方修改为//(//就是结束符),注意DELIMITER 和 // 之间一定要有一个空格

DELIMITER //
    CREATE PROCEDURE ShowStuScore()
    BEGIN
    SELECT * FROM tb_students_score;
END //

2、查看存储过程

创建存储过程后,可以通过SHOW ATATUS语句查看存储过程的状态以及存储程序的定义

-- SHOW PROCEDURE STATUS LIKE语句查看存储过程的状态,LIKE不能省略
SHOW PROCEDURE STATUS LIKE 存储过程名;


-- SHOW CREATE PROCEDURE语句查看存储过程的定义
SHOW CREATE PROCEDURE 存储过程名;

3、修改存储过程

-- MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程
ALTER PROCEDURE 存储过程名 [ 特征 ... ]

-- ALTER PROCEDURE 语句用于修改存储过程的特征
-- 如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程
-- 如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。

4、删除存储过程

-- MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程
DROP PROCEDURE <过程名>

-- 通过查询***数据库下的**表来确认上面的删除是否成功。SQL 语句和运行结果如下:
mysql> SELECT * FROM ***.** WHERE routine_name='ShowStuScore';

三、存储函数实战

存储函数与存储过程一样,存储函数是在数据库中定义的SQL语句的集合。存储函数可以通过return语句返回函数值,该语句主要用于计算和返回值。存储过程不直接返回值,主要用于执行操作。

-- 使用 CREATE FUNCTION 语句来创建存储函数
CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body

	
DELIMITER //
    CREATE FUNCTION func_student(id INT(11))
    RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
END //

总结

存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中供所有用户调用的子程序。它们预先编译并存储在数据库系统中。本文讲解全面讲解其特性与优缺点,并附以实战解析。

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

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

相关文章

LeetCode题解 二叉树(九):106 中序和后序遍历序列构造二叉树;105 从前序与中序遍历序列构造二叉树

下面要讲的两道题&#xff0c;从二叉树的角度来讲&#xff0c;是非常重要的&#xff0c;此前一直是遍历二叉树&#xff0c;现在就要根据数组&#xff0c;构造二叉树 106 从中序与后序遍历序列构造二叉树 medium 示例&#xff1a;中序遍历 inorder [9,3,15,20,7] 后序遍历 po…

SpringBoot做个埋点监控

JVM应用度量框架Micrometer实战 前提 spring-actuator做度量统计收集&#xff0c;使用Prometheus&#xff08;普罗米修斯&#xff09;进行数据收集&#xff0c;Grafana&#xff08;增强ui&#xff09;进行数据展示&#xff0c;用于监控生成环境机器的性能指标和业务数据指标。…

Three.js一学就会系列:04 炫酷3D文字

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 Three.js一学就会系列&#xff1a;03 炫酷3D划线 文章目录系列文章目录前言一、创建一个vue项目二、安装及使用安装创建一个dom元素三、核心代码讲解场景处理“雾”光…

83.【JQuery.Ajax】

Ajax(一)、Ajax简介1.什么是Ajax2.jQuery.ajax介绍(二)、环境搭建1.创建Model并添加web框架2.配置Artifacts的lib文件3.配置web框架下的web.xml4.配置spring-mvc.xml配置文件5.配置汇总文件applicationContexe.xml6.进行测试(三)、伪造Ajax1.iframe内敛框架伪造Ajax(四)、使用真…

【阶段二】Python数据分析NumPy工具使用01篇:NumPy工具介绍、NumPy工具安装与数组的创建

本篇的思维导图: NumPy工具介绍 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,这个包封装了多个可以用于数组间计算的函数供你直接调用,是一个运行速度非常快的数学库。 NumPy工具安装 代码 结果

从输入URL到渲染的过程中到底发生了什么?

CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来&#xff0c;再对其过程加以解释&#xff0c;了解过程中可以做哪些优化。文章内容有点长&#xff0c;需要有足够的耐心看完哟&#xff01;&…

MySQL数据库高级面试题(2)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

【自学Java】Java if else-if else语句

Java else if Java else if教程 在 Java 语言 中&#xff0c;关键字 if 是用于测试某个条件&#xff08;布尔型 或逻辑型&#xff09;的语句是否满足一定的条件&#xff0c;如果满足特定的条件&#xff0c;则会执行 if 后由大括号 {} 括起来的代码块&#xff0c;否则就忽略该…

利用Dlib 实现人脸68个特征点的标定

系列文章目录 文章目录系列文章目录前言1. 开发环境依赖2. 设计流程68个特征点提取&#xff1a;OpenCv 绘图&#xff1a;3. 源码OpenCv 的画图函数1. 画圆2. 写字符3.关于 颜色数组&#xff1a;前言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进…

【C语言 数据结构】树

文章目录树一、树的概念二、树的应用1&#xff09;树可表示具有分枝结构关系的对象2&#xff09;树是常用的数据组织形式三、树的表示四、树的基本术语五、树的四种表示方法5.1 双亲表示法5.2 孩子表示法5.3 双亲孩子表示法5.4 孩子兄弟表示法树 一、树的概念 树形结构是一种…

Git基础知识学习

1. Git工作机制 Workspace&#xff1a; 工作区&#xff0c;就是你平时存放项目代码的地方Index / Stage&#xff1a; 暂存区&#xff0c;用于临时存放你的改动&#xff0c;事实上它只是一个文件&#xff0c;保存即将提交到文件列表信息Repository&#xff1a; 仓库区&#xff0…

CleanMyMac4.12.3全新版本Mac清理优化工具

CleanMyMac X是一款超好用的Mac清理优化工具&#xff0c;可以帮助用户删除系统垃圾、不需要的应用程序和恶意软件&#xff0c;并调整您的 Mac 以获得最大速度&#xff01; CleanMyMac X作为一款知名的系统清理软件&#xff0c;深受广大用户们的喜爱。它操作简洁&#xff0c;能够…

Mycat2(三)mycat2搭建读写分离

文章目录一、mycat一主一从读写分离原理二、搭建MySQL主从复制三、配置mycat2一主一从读写分离四、配置Mycat2双主双从读写分离4.1 Mysql 双主双从搭建步骤1、创建MySQL数据库与MySQL 机器信息2、双柱双从配置2.1 master1配置2.2 master2配置2.3 Slave1、Slave2 配置3、在两台主…

程序员如何在职场上走得更远一些?

一. 工作心态 首先第一个要聊的啊就是这个心态的问题&#xff0c;我觉得有时候可以改变一下自己的心态&#xff0c;可以尝试把工作当成一种投资&#xff0c;或者说呢把工作当成一种自己的产品来经营&#xff0c;把目光多多的聚焦在这个收获和成长上面啊这样一个心态来应对&…

KV数据分片和分布

KV数据分片和分布 KV存储数据组织方式 Hash&#xff1a;对于Hash方式&#xff0c;键值对数据的存储位置由预定义的Hash函数确定&#xff0c;因此所有键值对数据不是有序排列。Hash方式的优点是通过Hash函数计算存储位置的效率高&#xff0c;因此处理插入、删除、更新、单点查…

MySQL之事务

引入事务&#xff1a; 一个事务其实就是一个完整的业务逻辑&#xff0c;它是一个最小的工作单元&#xff0c;是不可再分的。 那么什么是一个完整的业务逻辑呢&#xff1f; 拿现实生活中的银行业务举例&#xff0c;假设转账&#xff0c;从A账户向B账户中转账10000&#xff0c…

Redis:一、简介

Redis 1. redis的简介 1.1 NoSQL的介绍 在介绍redis之前&#xff0c;我们先来了解一下NoSQL(Not only SQL)&#xff0c;不仅仅是SQL。 NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系型数据库在应付web2.0网站&#xff0c;特别…

Cache(缓存)基本概念

cache的概念在计算机中被广泛应用&#xff0c;包括TLB等都使用了它的理念&#xff0c;因此对其进行总结。Cache——位于CPU上&#xff0c;处于寄存器和内存之间的存储单元。 Cache Hit & Miss在写入cache的时候&#xff0c;有hit&#xff08;命中&#xff09;和miss&#x…

基于ros1的 apollo 7.0.0规划控制算法

apollo.ros-7.0.0 上次给大家带来了之前学习apollo时开发的内容apollo.ros-1.0.0和apollo.ros-3.0.0&#xff0c;主要是针对apollo 1.0.0和3.0.0版本进行了ros1下的移植和规划控制算法的学习。本次在之前工作的基础上&#xff0c;针对apollo 7.0.0版本&#xff0c;进行了ros1下…

植物大战僵尸:分析植物的攻击速度

植物大战僵尸中&#xff0c;植物是有攻击速度的&#xff0c;比如每隔一段时间会吐出一些子弹&#xff0c;那么由此可判断吐出子弹应该是由一个计数器控制的&#xff0c;也就是说只要我们能够找到控制植物攻击的时钟并改写它&#xff0c;也就可以实现植物的无限吐子弹。 吐出子…