MySQL 自定义函数

本文深入讲解MySQL用户自定义函数(UDF)的创建与使用,包括无参、有参及复合结构函数,演示如何通过UDF扩展MySQL功能,实现数据处理的定制化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。

  • 自定义函数的两个必要条件:

    1. 参数
    2. 返回值.
  • 函数可以返回任意类型的值,同样可以接收这些类型的参数

  • 创建自定义函数

CREATE FUNCTION function_ name
RETURNS { STRING | INTEGER | REAL | DECIMAL }
routine_body

  • 关于函数体
    1. 函数体由合法的SQL语句构成;

    2. 函数体可以是简单的SELECT或INSERT语句;

    3. 函数体如果为复合结构则使用BEGIN…END语句;

    4. 复合结构可以包含声明,循环,控制结构。

创建一个无参的自定义函数

mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
    -> RETURN DATE_FORMAT(NOW(), '%Y年%m月%d日  %H时:%i分:%s秒'
    -> );
Query OK, 0 rows affected (0.01 sec)

# 调用函数
mysql> SELECT f1();
+--------------------------------+
| f1()                           |
+--------------------------------+
| 2019022019:18:20|
+--------------------------------+
1 row in set (0.00 sec)

创建一个有参的自定义函数

mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
    -> RETURNS FLOAT(10, 2) UNSIGNED
    -> RETURN (num1 + num2) / 2;
Query OK, 0 rows affected (0.01 sec)

# 调用函数
mysql> SELECT f2(10, 25);
+------------+
| f2(10, 25) |
+------------+
|      17.50 |
+------------+
1 row in set (0.00 sec)

创建具有符合结构函数的自定义函数

  • 创建数据表
mysql> CREATE TABLE test(
    -> id TINYINT(3) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(20) DEFAULT NULL
    -> );
Query OK, 0 rows affected (0.02 sec)
  • 插入数据
mysql> INSERT test (username) VALUES(John);
mysql> INSERT test (username) VALUES('111');
  • 查看表结构
mysql> DESC test;
+----------+---------------------+------+-----+---------+----------------+
| Field    | Type                | Null | Key | Default | Extra          |
+----------+---------------------+------+-----+---------+----------------+
| id       | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)         | YES  |     | NULL    |                |
+----------+---------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
  • 修改MySQL默认的结束符 DELIMITER
mysql> DELIMITER //
mysql> SELECT NOW();
    -> //
+---------------------+
| NOW()               |
+---------------------+
| 2019-02-20 22:38:48 |
+---------------------+
1 row in set (0.00 sec)
  • 创建一个函数,实现向 test 表中插入一条数据,并返回该条数据的 id 号
mysql> CREATE FUNCTION adduser(username VARCHAR(20))
    -> RETURNS INT UNSIGNED
    -> BEGIN
    -> INSERT test(username) VALUES(username);
    -> RETURN LAST_INSERT_ID();
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

# 调用函数
mysql> SELECT adduser('Rose');
    -> //
+-----------------+
| adduser('Rose') |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.01 sec)

# 改回MySQL默认的结束符
mysql> DELIMITER ;
mysql> SELECT * FROM test;
+----+----------+
| id | username |
+----+----------+
|  1 | John     |
|  2 | 111      |
|  3 | Rose     |
+----+----------+
3 rows in set (0.00 sec)

删除函数

DROP FUNCTION [IF EXISTS] function name

mysql> DROP FUNCTION f2;
Query OK, 0 rows affected (0.03 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值