多语网站,php面试题,广告创意设计海报,企业网站推广是不是必要的存储函数是一种数据库对象#xff0c;允许用户将常用的 SQL 逻辑封装为可复用的函数#xff0c;通过调用函数完成特定的计算或业务逻辑。 1. 简介
1.1 什么是存储函数
存储函数#xff08;Stored Function#xff09;是用户定义的一段 SQL 逻辑#xff0c;返回一个值允许用户将常用的 SQL 逻辑封装为可复用的函数通过调用函数完成特定的计算或业务逻辑。 1. 简介
1.1 什么是存储函数
存储函数Stored Function是用户定义的一段 SQL 逻辑返回一个值可用于查询中直接调用。
1.2 存储函数的特点
必须返回一个值。可以接受输入参数但不能有输出参数。适用于需要重复使用的计算逻辑。通常作为 SQL 查询的一部分调用。 2. 语法
2.1 创建存储函数
CREATE FUNCTION 函数名(参数列表)
RETURNS 数据类型
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN函数体;RETURN 返回值;
END;参数列表定义函数的输入参数。 RETURNS 数据类型指定函数的返回值类型。 DETERMINISTIC / NOT DETERMINISTIC DETERMINISTIC函数的结果是确定性的输入相同返回值始终相同。NOT DETERMINISTIC结果可能受其他因素如系统时间影响。NO SQL 不包含 SQL 语句。READS SQL DATA包含读取数据的语句但不包含写入数 函数体由一组 SQL 语句组成包含计算逻辑。 2.2 调用存储函数
SELECT 函数名(参数);2.3 删除存储函数
DROP FUNCTION [IF EXISTS] 函数名;3. 使用场景
重复计算封装复杂计算逻辑简化查询语句。数据转换对特定数据进行格式化或转换。业务规则实现特定业务规则例如折扣计算、税费计算等。 4. 对比存储过程
特性存储函数存储过程返回值必须返回一个值不要求返回值可以通过 OUT 参数返回数据调用方式可以在 SQL 语句中调用使用 CALL 调用应用场景用于计算或转换作为表达式使用用于复杂的业务逻辑和批量操作嵌套调用可以嵌套在其他查询中通常用于独立执行的业务逻辑参数支持仅支持输入参数支持输入、输出和双向参数 5. 案例
5.1 简单计算函数
需求
创建一个存储函数计算两数之和。
创建函数
DELIMITER $$CREATE FUNCTION add_numbers(a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGINRETURN a b;
END$$DELIMITER ;调用函数
SELECT add_numbers(10, 20); -- 返回 305.2 数据转换函数
需求
创建一个函数将指定日期格式化为 YYYY-MM-DD。
创建函数
DELIMITER $$CREATE FUNCTION format_date(input_date DATE)
RETURNS VARCHAR(10)
DETERMINISTIC
BEGINRETURN DATE_FORMAT(input_date, %Y-%m-%d);
END$$DELIMITER ;调用函数
SELECT format_date(2024-11-20); -- 返回 2024-11-205.3 业务规则函数
需求
创建一个函数根据销售额计算折扣。
规则
销售额大于 500折扣为 10%。否则折扣为 5%。
创建函数
DELIMITER $$CREATE FUNCTION calculate_discount(sales DECIMAL(10, 2))
RETURNS DECIMAL(10, 2)
DETERMINISTIC
BEGINIF sales 500 THENRETURN sales * 0.10;ELSERETURN sales * 0.05;END IF;
END$$DELIMITER ;调用函数
SELECT calculate_discount(600); -- 返回 60.00
SELECT calculate_discount(300); -- 返回 15.005.4 数据查询辅助函数
需求
创建一个函数根据员工编号返回员工姓名。
表结构
CREATE TABLE employees (emp_id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees VALUES (1, Alice), (2, Bob);创建函数
DELIMITER $$CREATE FUNCTION get_employee_name(emp_id INT)
RETURNS VARCHAR(100)
DETERMINISTIC
BEGINDECLARE emp_name VARCHAR(100);SELECT name INTO emp_name FROM employees WHERE emp_id emp_id;RETURN emp_name;
END$$DELIMITER ;调用函数
SELECT get_employee_name(1); -- 返回 Alice6. 注意事项
函数限制 存储函数无法直接执行事务控制如COMMIT、ROLLBACK。函数中不可使用动态 SQL如PREPARE。 性能 函数执行频繁时可能对性能有影响建议优化函数逻辑。 权限 创建存储函数需要 CREATE ROUTINE 权限。 通过以上内容您可以快速了解和应用 MySQL 存储函数在实际业务中实现高效的计算与数据转换。