1. 首页 > MySQL教程 > 正文

MySQL教程FG128-MySQL自定义函数创建与使用

内容简介:本文主要介绍MySQL存储过程参数与返回值的相关知识,包括参数类型、使用方法和最佳实践等内容。风哥教程参考MySQL官方文档MySQL Functions、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn 02 学习交流加群风哥微信: itpux-com 03 学习交流加群风哥QQ113257174

Part01-基础概念与理论知识

1.1 函数基础

MySQL自定义函数(UDF)允许用户创建自己的函数,扩展MySQL的功能。自定义函数可以接受参数并返回一个值。 04 风哥提示: 05更多学习教程公众号风哥教程itpux_com 06 from mysql视频:www.itpux.com

# 自定义函数语法
CREATE FUNCTION function_name (parameter_list)
RETURNS return_type
[DETERMINISTIC | NO SQL | READS SQL DATA | MODIFIES SQL DATA]
BEGIN
function_body
RETURN return_value;
END

# 删除函数
DROP FUNCTION [IF EXISTS] function_name

# 查看函数
SHOW FUNCTION STATUS;
SHOW CREATE FUNCTION function_name;

Part02-生产环境规划与建议

2.1 简单函数创建

# 简单函数示例

1. 创建字符串处理函数
DELIMITER //

CREATE FUNCTION format_phone_number(phone VARCHAR(20))
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE formatted_phone VARCHAR(20);

IF LENGTH(phone) = 11 THEN
SET formatted_phone = CONCAT(
SUBSTRING(phone, 1, 3), ‘-‘,
SUBSTRING(phone, 4, 4), ‘-‘,
SUBSTRING(phone, 8, 4)
);
ELSE
SET formatted_phone = phone;
END IF;

RETURN formatted_phone;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 使用函数
SELECT format_phone_number(‘13800138000’) AS formatted_phone;

输出示例:
+—————-+
| formatted_phone |
+—————-+
| 138-0013-8000 |
+—————-+
1 row in set (0.00 sec)

3. 创建数值计算函数
DELIMITER //

CREATE FUNCTION calculate_discount(price DECIMAL(10,2), discount_rate DECIMAL(5,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE discount_amount DECIMAL(10,2);
DECLARE final_price DECIMAL(10,2);

SET discount_amount = price * discount_rate / 100;
SET final_price = price – discount_amount;

RETURN final_price;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 使用函数
SELECT calculate_discount(1000.00, 15) AS discounted_price;

输出示例:
+——————+
| discounted_price |
+——————+
| 850.00 |
+——————+
1 row in set (0.00 sec)

Part03-生产环境项目实施方案

3.1 复杂函数创建

# 复杂函数示例

1. 创建年龄计算函数
DELIMITER //

CREATE FUNCTION calculate_age(birth_date DATE)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE age INT;

SET age = TIMESTAMPDIFF(YEAR, birth_date, CURDATE());

IF DATE_FORMAT(CURDATE(), ‘%m%d’) < DATE_FORMAT(birth_date, '%m%d') THEN
SET age = age – 1;
END IF;

RETURN age;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 使用函数
SELECT user_name, birth_date, calculate_age(birth_date) AS age
FROM users
WHERE id IN (1, 2, 3);

输出示例:
+———–+————+——+
| user_name | birth_date | age |
+———–+————+——+
| user001 | 1990-05-15 | 35 |
| user002 | 1985-10-20 | 40 |
| user003 | 1995-03-10 | 30 |
+———–+————+——+
3 rows in set (0.00 sec)

3. 创建数据统计函数
DELIMITER //

CREATE FUNCTION get_user_order_count(user_id INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE order_count INT;

SELECT COUNT(*) INTO order_count
FROM orders
WHERE user_id = user_id;

RETURN order_count;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 使用函数
SELECT user_name, get_user_order_count(id) AS order_count
FROM users
WHERE id IN (1, 2, 3);

输出示例:
+———–+————-+
| user_name | order_count |
+———–+————-+
| user001 | 50 |
| user002 | 30 |
| user003 | 20 |
+———–+————-+
3 rows in set (0.00 sec)

Part04-生产案例与实战讲解

4.1 函数操作

# 函数管理操作

1. 查看所有函数
SHOW FUNCTION STATUS;

输出示例:
+——+———————-+———-+—————-+———————+———————+
| Db | Name | Type | Definer | Modified | Created |
+——+———————-+———-+—————-+———————+———————+
| test | format_phone_number | FUNCTION | root@localhost | 2026-04-04 11:05:00 | 2026-04-04 11:05:00 |
| test | calculate_age | FUNCTION | root@localhost | 2026-04-04 11:10:00 | 2026-04-04 11:10:00 |
| test | get_user_order_count| FUNCTION | root@localhost | 2026-04-04 11:15:00 | 2026-04-04 11:15:00 |
+——+———————-+———-+—————-+———————+———————+

2. 查看函数详细信息
SHOW CREATE FUNCTION format_phone_number\G

输出示例:
*************************** 1. row ***************************
Function: format_phone_number
sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `format_phone_number`(phone VARCHAR(20)) RETURNS varchar(20) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
DETERMINISTIC
BEGIN
DECLARE formatted_phone VARCHAR(20);

IF LENGTH(phone) = 11 THEN
SET formatted_phone = CONCAT(
SUBSTRING(phone, 1, 3), ‘-‘,
SUBSTRING(phone, 4, 4), ‘-‘,
SUBSTRING(phone, 8, 4)
);
ELSE
SET formatted_phone = phone;
END IF;

RETURN formatted_phone;
END
character_set_client: utf8mb4
collation_connection: utf8mb4_unicode_ci
Database Collation: utf8mb4_unicode_ci

3. 删除函数
DROP FUNCTION IF EXISTS format_phone_number;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 从information_schema查询函数
SELECT ROUTINE_NAME, ROUTINE_TYPE, DETERMINISTIC, SQL_DATA_ACCESS
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = DATABASE();

输出示例:
+———————-+————–+—————+—————-+
| ROUTINE_NAME | ROUTINE_TYPE | DETERMINISTIC | SQL_DATA_ACCESS|
+———————-+————–+—————+—————-+
| calculate_age | FUNCTION | YES | READS SQL DATA |
| get_user_order_count | FUNCTION | YES | READS SQL DATA |
+———————-+————–+—————+—————-+

Part05-风哥经验总结与分享

5.1 函数使用最佳实践

# 函数使用最佳实践

1. 函数设计原则
– 保持函数简单
– 明确函数用途
– 合理设置特性
– 充分测试验证

2. 性能考虑
– 避免复杂查询
– 减少函数调用
– 考虑缓存结果
– 评估性能影响

3. 安全考虑
– 限制函数权限
– 验证输入参数
– 防止SQL注入
– 审计函数使用

4. 文档维护
– 说明函数用途
– 记录参数说明
– 提供使用示例
– 更新相关文档

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息