mysql的存储函数FUNCTION详解(定义、语法、创建、调用、和存储过程的异同)

目录

一、定义

二、存储函数的特点

1. 封装性

2. 重用性

3. 性能优化

4. 安全性

三、创建存储函数

1、基本语法

2、解释

四、存储函数示例

1、创建

2、调用存储函数

五、使用存储函数

1、使用方法

2、修改和删除存储函数

六、和存储过程PROCEDURE的区别

1. 返回值

2. 调用方式

3. 参数类型

4. 事务处理

5. 内部状态

6. 复杂度和灵活性

7. 语法差异

8. 用途

9. 性能

七、和存储过程PROCEDURE的共同点

1. 封装性

2. 可重用性

3. 安全性

4. 性能优化

5. 编程控制结构

八、注意事项


一、定义

        MySQL中的存储函数(Stored Function)是一种在数据库中定义的SQL语句集合,这些语句被封装成一个独立的执行单元,用于完成特定的数据库操作或计算,并返回一个值给调用者。

        存储函数与存储过程(Stored Procedure)类似,但主要区别在于存储函数必须返回一个值,而存储过程则不需要。

二、存储函数的特点

1. 封装性

        将复杂的SQL逻辑封装在函数中,使得调用者只需关心函数的调用和返回值,而无需了解函数内部的实现细节。

2. 重用性

        存储函数一旦定义,就可以在多个地方被调用,提高了代码的重用性。

3. 性能优化

        数据库管理系统可以针对存储函数进行优化,减少SQL语句的解析和编译时间,提高执行效率。

4. 安全性

        通过适当的权限控制,可以限制对存储函数的访问,确保数据的安全性。

三、创建存储函数

1、基本语法

在MySQL中,可以使用CREATE FUNCTION语句来创建存储函数。基本语法如下:

CREATE FUNCTION function_name (parameter_list)  
RETURNS return_datatype  
[characteristic ...]  
BEGIN  -- 函数体,包含一系列的SQL语句,比如变量声明、SQL语句、流程控制语句RETURN value;  
END;

2、解释

        - function_name:存储函数的名称。

        - parameter_list:函数的参数列表,由参数名和参数类型组成,参数之间用逗号分隔。参数是可选的,如果函数不需要参数,可以省略该部分。

        - return_datatype:函数返回值的类型。

        - characteristic:函数的特性,如DETERMINISTIC(确定性的,相同的输入总是返回相同的结果)、NO SQL(不包含SQL语句)、READS SQL DATA(包含读取数据的SQL语句)等。这些特性是可选的,用于指定函数的性质,帮助数据库优化执行计划。

        - function_body:函数体,包含了一系列的SQL语句,用于实现函数的逻辑。函数体必须包含至少一个RETURN语句,用于返回函数的值。

四、存储函数示例

1、创建

        以下是一个简单的存储函数示例,该函数接受一个整数作为参数,并返回该整数的平方。

DELIMITER$$CREATE FUNCTION Square(num INT)  
RETURNS INT  
DETERMINISTIC  
BEGIN  RETURN num * num;  
END$$DELIMITER ;

        在这个示例中,使用了DELIMITER 语句来更改命令分隔符,以便在函数体中使用;

        作为语句的分隔符,而不会导致整个CREATE FUNCTION语句被提前终止。

        然后,定义Square函数,它接受一个名为num的整数参数,并返回该参数的平方值。

        最后,将命令分隔符改回为;。

2、调用存储函数

        存储函数创建后,可以通过SELECT语句或作为其他SQL语句的一部分来调用。以下是如何调用上面定义的Square函数的示例:

SELECT Square(5);   -- 返回值为 25

        这条SELECT语句调用了Square函数,并传入参数5,函数返回25作为结果。

五、使用存储函数

1、使用方法

        存储函数可以在各种SQL语句中使用,比如SELECT,INSERT,UPDATE,DELETE等。它们可以作为表达式的一部分,嵌入到更复杂的SQL查询中。

2、修改和删除存储函数

        如果需要修改存储函数,可以使用ALTER FUNCTION语句。但是,在较旧版本的MySQL中,可能需要先使用DROP FUNCTION删除函数,然后重新创建它。

-- 修改存储函数
ALTER FUNCTION function_name ...
-- 或者
DROP FUNCTION function_name;
CREATE FUNCTION function_name ...

六、和存储过程PROCEDURE的区别

        在MySQL中,存储过程(PROCEDURE)和存储函数(FUNCTION)都是存储例程(Stored Routines),但它们在设计目的、语法结构和使用方式上有显著的不同。下面是它们之间的主要区别:

1. 返回值

        存储函数:必须返回一个值。函数的定义中包含RETURNS关键字,指定返回值的数据类型。

        存储过程:不返回任何值。它可以修改数据库中的数据,执行复杂的事务处理,或者通过输出参数传递结果。

2. 调用方式

        存储函数:可以直接在SQL语句中像内置函数那样调用,无需使用特殊语句。

        存储过程:使用CALL语句来调用,通常用于执行一系列操作或复杂的数据库事务。

3. 参数类型

        存储函数:只接受输入参数(IN参数)。

        存储过程:可以接受IN(输入)、OUT(输出)、INOUT(输入输出)类型的参数,这使得过程可以返回多个值或修改外部变量。

4. 事务处理

        存储过程:可以包含事务控制语句,如COMMIT和ROLLBACK,以便处理复杂的事务逻辑。

        存储函数:通常不能直接包含事务控制语句,除非函数声明为CONTAINS SQL或MODIFIES SQL DATA。

5. 内部状态

        存储函数:理论上不应该修改数据库的状态,虽然现代版本的MySQL允许函数修改数据,但这通常不推荐。

        存储过程:可以修改数据库状态,执行数据插入、更新、删除等操作。

6. 复杂度和灵活性

        存储过程:可以包含更复杂的逻辑,如循环、条件分支和其他流程控制语句。

        存储函数:通常用于执行单一的计算或操作,虽然也可以包含流程控制,但其主要目的是返回一个计算结果。

7. 语法差异

        在定义时,存储函数使用RETURNS关键字来指定返回值的类型,而存储过程则不需要。

        存储函数的函数体内部必须使用RETURN语句来返回一个值,而存储过程则可以使用SELECT语句返回结果集,或者通过输出参数返回数据。

8. 用途

        存储函数更适合用于计算并返回一个值,例如计算两个数的和、字符串的拼接等。

        存储过程更适合用于执行一系列复杂的数据库操作,如插入、更新、删除数据,以及执行复杂的业务逻辑等。存储过程可以包含控制流语句(如IF...THEN...ELSELOOPWHILE等),而存储函数则通常不包含这些控制流语句。

9. 性能

        在性能方面,存储过程和存储函数都可以提高应用程序的性能,因为它们允许数据库系统对SQL语句进行预编译和优化。然而,由于存储过程可以执行更复杂的操作,因此在某些情况下,存储过程可能比存储函数提供更显著的性能提升。

七、和存储过程PROCEDURE的共同点

        存储过程(PROCEDURE)和存储函数(FUNCTION)作为数据库中的两种重要对象,它们在执行复杂数据库操作、封装SQL语句集合等方面具有一些共同点。以下是它们的主要共同点:

1. 封装性

        封装SQL语句:存储过程和存储函数都用于封装一组SQL语句,以便实现特定的数据库操作或计算。这种封装性有助于隐藏复杂的数据库逻辑,使得数据库操作更加模块化和易于管理。

2. 可重用性

        提高代码重用性:一旦创建了存储过程或存储函数,它们就可以在数据库中被多次调用,而无需重新编写相同的SQL语句。这大大提高了代码的重用性,减少了代码的冗余。

3. 安全性

        控制数据访问:通过为存储过程和存储函数设置适当的权限,可以限制哪些用户或应用程序可以执行它们。这有助于保护数据库的安全,防止未经授权的访问或修改。

4. 性能优化

        预编译执行:存储过程和存储函数在创建时会被预编译并存储在数据库中。当它们被调用时,数据库可以直接执行预编译的代码,而无需再次进行编译。这通常比执行单独的SQL语句更快,因为避免了编译的开销。

5. 编程控制结构

        支持控制流语句:存储过程通常支持更复杂的控制流语句(如IF...THEN...ELSE、LOOP、WHILE等),而存储函数虽然在这些方面的支持可能较为有限,但它们仍然可以在一定程度上使用这些控制结构来实现逻辑判断。

八、注意事项

        存储函数是强大的工具,可以用来封装复杂的业务逻辑,提高代码的可读性和可维护性。在使用中,有如下需要注意的:

        1、存储函数不能包含COMMIT或ROLLBACK这样的事务控制语句,除非函数被声明为CONTAINS SQL或MODIFIES SQL DATA。

        2、函数体中可以使用流程控制语句,如IF, CASE, WHILE, LOOP, REPEAT, LEAVE, 和 ITERATE。

        3、存储函数的参数不能有IN, OUT, 或 INOUT修饰符,因为函数只能返回一个值。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


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

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

相关文章

JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

文章目录 前言一. JDBC概述1. JDBC 概念2. JDBC 本质3. JDBC 的好处 二. JDBC 快速入门1. 编写Java 程序步骤2. 在IDEA 中的操作流程3. 正式编写 Java程序 三. JDBC API详解1. DriverManager 类2. Connection 接口2.1 获取执行SQL语句的对象 3 .ResultSet 类3.1 概述3.2 代码实…

【MySQL】10.用户管理

用户管理 一.用户1.创建用户2.删除用户3.修改用户的密码 二.用户对数据库的权限1.给用户授权2.查看用户权限3.回收用户权限 一.用户 所有的用户信息都保存在数据库 mysql 的 user 表中 select host, user, authentication_string from user;----------------------------------…

sql优化策略

1.索引优化 在经常用于过滤&#xff08;WHERE子句&#xff09;和排序&#xff08;ORDER BY子句&#xff09;的列上创建索引。(使用索引) 避免在WHERE子句中使用非等值比较&#xff08;如!, <>&#xff09;&#xff0c;因为这可能使数据库无法使用索引。 使用覆盖索引&a…

Cadence23学习笔记(四)

这个人讲cadence也很不错&#xff1a; 73、创建Power NetClass[Cadence Allegro132讲视频教程字幕版]_哔哩哔哩_bilibili 上位机开发&#xff1a; MFC 最详细入门教程-CSDN博客 Board Geometry — Design_Outline 板框 Etch — Top 走线 Pin — Top 焊盘 …

06day-C++类和对象(下)

这里写目录标题 1. 再探构造函数小例题1 2. 类型转换3. static成员小例题2 4. 友元5. 内部类6. 匿名对象7.对象拷⻉时的编译器优化 1. 再探构造函数 • 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅式&#xf…

探索APP开发中的主流版式设计与应用实践

在当今移动互联网高速发展的时代&#xff0c;APP已成为人们日常生活中不可或缺的一部分。无论是社交娱乐、购物支付还是工作学习&#xff0c;各类APP都以其独特的界面设计和用户体验赢得了用户的青睐。而APP开发的版式设计和页面规范&#xff0c;则是决定用户体验好坏的关键因素…

记录些MySQL题集(6)

MySQL 单表为什么不要超过 2000W 行&#xff1f; 数据持久化在磁盘中&#xff0c;磁盘的最小单元是扇区&#xff0c;一个扇区 0.5 KB&#xff0c;而由 8 个扇区可以构成一个文件系统块&#xff08;4K&#xff09;&#xff0c;以 InnoDB 存储引擎为例&#xff0c;一个数据页的大…

Netty TCP

Netty在TCP通信中扮演着重要的角色&#xff0c;它是一个高性能、异步事件驱动的网络应用框架&#xff0c;专门用于快速开发可维护的高性能协议服务器和客户端。以下是从不同方面对Netty在TCP通信中的应用进行详细说明&#xff1a; 一、Netty的特点与优势 高性能&#xff1a;N…

打卡第15天------二叉树

最近公司给我派活儿太多了,要干好多活儿,好多工作任务要处理,我都没时间刷题了。leetcode上的题目通过数量一直停留在原地不动,我真的很着急呀,我现在每天过的都有一种紧迫感,很着急,有一种与时间赛跑的感觉,真的时间过的太快了,没有任何人能够阻挡住时间的年轮向前推…

【异步爬虫:利用异步协程抓取一部电影】

利用异步协程抓取一部电影 我们把目光转向wbdy. 目前该案例还是可以用的. 我们想要抓取网上的视频资源就必须要了解我们的视频网站是如何工作的. 这里我用91看剧来做举例. 其他网站的原理是一样的. 1.视频网站是如何工作的 假设, 你现在想要做一个视频网站. 也有很多的UP猪…

【BUG】已解决:java.lang.IllegalStateException: Duplicate key

已解决&#xff1a;java.lang.IllegalStateException: Duplicate key 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

【数学建模】——多领域资源优化中的创新应用-六大经典问题解答

目录 题目1&#xff1a;截取条材 题目 1.1问题描述 1.2 数学模型 1.3 求解 1.4 解答 题目2&#xff1a;商店进货销售计划 题目 2.1 问题描述 2.2 数学模型 2.3 求解 2.4 解答 题目3&#xff1a;货船装载问题 题目 3.1问题重述 3.2 数学模型 3.3 求解 3.4 解…

常用网络术语或概念

1. IP地址&#xff08;IP Address&#xff09; IPv4地址&#xff1a; 一种32位地址&#xff0c;用于标识网络中的设备。通常表示为四个十进制数&#xff0c;每个数用点分隔&#xff0c;例如192.168.1.1。    IPv6地址&#xff1a; 一种128位地址&#xff0c;用于解决IPv4地址…

【Go系列】 Go的高并发模式

承上启下 我们在之前已经学习了goroutine和channel的并发模式&#xff0c;也学会了sync库和context的控制。那么在Go里面一般都会使用哪些高并发模式呢&#xff1f;今天让我们在这篇文章中一起揭晓一下。 开始学习 for ... select...模式 for select模式是Go语言中处理并发的…

tomcat如何进行调优?

从两个方面考虑&#xff1a;内存和线程 首先启动Tomcat&#xff0c;实际上就是启动了一个JVM&#xff0c;所以可以按JVM调优的方式来进行调整&#xff0c;从而达到Tomcat优化的目的。 另外Tomcat中设计了一些缓存区&#xff0c;比如appReadBufSize、bufferPoolSize等缓存区来提…

设计模式使用场景实现示例及优缺点(结构型模式——享元模式)

国度的东南角&#xff0c;有一个被称为“享元村”的小村庄。村里的居民都是非常聪明的软件设计师&#xff0c;他们擅长用一种叫做“享元模式”的技术来解决内存使用问题。享元模式的核心思想是共享&#xff1a;通过共享来支持大量的细粒度对象的使用&#xff0c;从而在不牺牲程…

C# 设计一个可变长度的数据通信协议编码和解码代码。

设计一个可变长度的数据通信协议编码和解码代码。 要有本机ID字段&#xff0c;远端设备ID字段&#xff0c;指令类型字段&#xff0c;数据体字段&#xff0c;校验字段。其中一个要求是&#xff0c;每次固定收发八个字节&#xff0c;单个数据帧超过八个字节需要分包收发。对接收的…

超详细信息收集篇

1 域名信息收集 1.1 域名是什么 域名&#xff08;英语&#xff1a;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的 Internet 上某一台 计算机 或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地…

数据结构——栈和队列(C语言实现)

写在前面&#xff1a; 栈和队列是两种重要的线性结构。其也属于线性表&#xff0c;只是操作受限&#xff0c;本节主要讨论的是栈和队列的定义、表示方法以及C语言实现。 一、栈和队列的定义与特点 栈&#xff1a;是限定仅在表尾进行插入和删除的线性表。对栈来说&#xff0c;表…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…