自学内容网 自学内容网

SQL存储函数的使用场景和几个经典实例详细介绍

目录

一、存储函数概述

1、定义

2、更多

二、SQL存储函数的应用场景

1、复杂计算

2、数据验证

3、业务规则

4、格式化输出

5、序列生成

6、封装重复代码

7、数据清理和准备

8、自定义聚合函数

9、触发器辅助

10、跨表操作

三、示例1:创建计算两数之和的存储函数

1、说明

2、代码

3、解释

4、使用存储函数

5、补充说明

四、示例 2:检查年份是否为闰年

五、示例 3:获取员工的电子邮件地址

1、说明

2、代码

3、解释

六、示例 4:计算字符串长度

1、说明

2、代码

3、解释

4、调用存储函数

5、补充说明


一、存储函数概述

1、定义

        MySQL的存储函数(Stored Function)是一种在数据库中定义的、用于执行特定操作并返回一个值的数据库对象。存储函数类似于编程语言中的函数,它们可以接受参数、执行一系列操作,并返回一个结果。

2、更多

       若想了解更多关于存储函数的相关知识,可以参考如下文章:

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

(2)《mysql存储函数:视频监控中的异常事件的数量统计,以及在命令行和navicat中的调用方法》

二、SQL存储函数的应用场景

        存储函数在数据库服务器上执行,可以提高应用程序的性能,因为它们减少了网络往返次数,并且可以更好地利用数据库的计算资源。以下是 MySQL 存储函数的一些常见应用场景:

1、复杂计算

        当需要对数据进行复杂的数学或逻辑运算时,可以创建存储函数来封装这些计算逻辑,例如,计算折扣价格、汇率转换或复杂数学公式。

        存储函数的计算场景,包括基本的数学运算、逻辑判断、数据库查询等。通过创建存储函数,可以将复杂的逻辑封装在数据库内部,从而提高应用程序的性能和可维护性。

2、数据验证

        在数据插入或更新之前,可以使用存储函数来检查数据的有效性,例如,确保日期格式正确或数值在合理范围内。

3、业务规则

        实现业务逻辑,比如计算员工工资、税收、佣金等,这可以简化应用程序代码,并将业务规则集中管理。

4、格式化输出

        格式化日期、货币或任何其他字段,以符合特定的显示标准,例如,将日期转换为“YYYY-MM-DD”格式。

5、序列生成

        创建一个存储函数来生成唯一序列号或ID,这对于没有自增主键的表或需要额外唯一标识符的情况很有用。

6、封装重复代码

        如果在多个查询或存储过程中有重复的代码片段,可以将其封装到存储函数中,以减少代码冗余并提高维护性。

7、数据清理和准备

        在数据导入或导出时,可以使用存储函数来清洗数据,例如,去除空格、转换大小写或替换特殊字符。

8、自定义聚合函数

        虽然MySQL提供了基本的聚合函数如SUM、AVG等,但有时需要更复杂的聚合逻辑,这时可以创建自定义的聚合函数。

9、触发器辅助

        存储函数可以被触发器调用来执行某些操作,例如,在更新记录时自动调整相关联的统计信息。

10、跨表操作

        当需要从多个表中获取数据并进行计算时,存储函数可以帮助组合这些数据并返回所需的结果。       

为了更好的理解MySQL存储函数以及应用场景,本文举几个实例,并进行解释,希望能够帮助到您。

三、示例1:创建计算两数之和的存储函数

1、说明

        首先,我们需要在MySQL数据库中创建一个存储函数,该函数将接受两个参数(我们假设它们都是整数),然后返回这两个参数的和。

2、代码

DELIMITER $$


CREATE FUNCTION AddNumbers(num1 INT, num2 INT)
RETURNS INT
BEGIN
    RETURN num1 + num2;
END$$

DELIMITER ;

3、解释

(1)DELIMITER:MySQL默认的分隔符是分号(;)。但是,在定义存储函数或存储过程时,由于函数体内部可能包含多条语句,每条语句的末尾都需要用分号结束。为了避免混淆,我们使用DELIMITER命令将分隔符临时更改为$$,这样MySQL就知道在$$之前的内容都属于函数体的一部分,直到遇到$$才结束。在存储函数或存储过程定义结束后,我们再将分隔符改回为分号(;)。

(2)CREATE FUNCTION:这是用来创建存储函数的SQL语句。AddNumbers是函数的名称,(num1 INT, num2 INT)定义了函数的参数列表,这里有两个参数num1和num2,它们都是整数类型(INT)。

(3)RETURNS INT:这指定了函数的返回类型,这里是整数(INT)。

(4)BEGIN ... END:这是函数体的开始和结束。在BEGIN和END之间,我们定义了函数的执行逻辑,这里是简单的将两个参数相加并返回结果。

(5)RETURN:这是SQL中用于返回值的语句。在这里,它返回num1 + num2的结果。

4、使用存储函数

创建存储函数后,可以像调用内置函数一样调用它。例如:

SELECT AddNumbers(5, 3) AS Result;

这将返回8作为结果。

5、补充说明

        存储函数非常适合在数据库中进行复杂的计算或逻辑处理,因为它们可以在数据库服务器上执行,减少了应用程序和数据库之间的数据传输量,并可能提高整体性能。

        MySQL的存储函数还可以用于各种复杂的计算和逻辑处理。

四、示例 2:检查年份是否为闰年

DELIMITER $$



CREATE FUNCTION is_leap_year(year_value INT)

RETURNS BOOLEAN

BEGIN

    IF (year_value % 4 = 0 AND year_value % 100 != 0) OR (year_value % 400 = 0) THEN

        RETURN TRUE;

    ELSE

        RETURN FALSE;

    END IF;

END$$



DELIMITER ;

        注意:MySQL实际上没有BOOLEAN类型,这里使用BOOLEAN是为了说明目的,实际上MySQL将其视为TINYINT(1)的别名,其中1代表TRUE,0代表FALSE。

五、示例 3:获取员工的电子邮件地址

1、说明

        假设有一个名为employees的表,其中包含员工的ID和电子邮件地址等字段,你可以创建一个存储函数来根据员工ID返回其电子邮件地址。

2、代码

DELIMITER $$



CREATE FUNCTION email_by_id(emp_id INT)

RETURNS VARCHAR(255)

DETERMINISTIC

CONTAINS SQL

BEGIN

    RETURN (SELECT email FROM employees WHERE employee_id = emp_id);

END$$



DELIMITER ;

3、解释

        这个函数email_by_id接受一个整数参数emp_id,并返回对应员工的电子邮件地址。注意,这里假设email字段是VARCHAR(255)类型,可能需要根据实际情况调整返回类型的大小。

六、示例 4:计算字符串长度

1、说明

        虽然MySQL已经提供了内置的LENGTH()函数来计算字符串的长度,但我们可以为了演示目的创建一个类似的存储函数。

2、代码

DELIMITER $$



CREATE FUNCTION my_string_length(input_string VARCHAR(255))

RETURNS INT

BEGIN

    RETURN LENGTH(input_string);

END$$



DELIMITER ;

3、解释

        这个函数my_string_length接受一个字符串参数input_string,并返回其长度。

4、调用存储函数

        一旦创建了存储函数,就可以在SQL查询中像调用内置函数一样调用它。例如:

        SELECT add_numbers(3, 5) AS Sum; -- 返回 8

        SELECT is_leap_year(2020) AS IsLeap; -- 返回 1 (TRUE)

        SELECT email_by_id(101) AS Email; -- 假设employee_id为101的员工有电子邮件

        SELECT my_string_length('Hello, World!') AS Length; -- 返回 13

5、补充说明

        示例展示了MySQL存储函数的应用场景,包括基本的数学运算、逻辑判断、数据库查询等。通过创建存储函数,可以将复杂的逻辑封装在数据库内部,从而提高应用程序的性能和可维护性。


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



原文地址:https://blog.csdn.net/weixin_70208651/article/details/140648278

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!