目录
一、定义
二、存储函数的特点
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...ELSE、LOOP、WHILE等),而存储函数则通常不包含这些控制流语句。
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 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。