MySQL自定义函数创建与使用总结

MySQL自定义函数和存储过程类似,也需要在数据库中创建并保存。它与存储过程一样,都是由SQL语句和控制语句组成的代码片段,可以被应用程序和其他SQL语句调用。
MySQL自定义函数与存储过程存在以下区别:
1、存储过程可以定义in(输入),out(输出)、inout(输入输出)三种类型的参数,自定义函数不能定义输出参数;
2、自定义函数中必须包含RETURN语句,用来返回一个值,存储过程则不需要RETURN语句;
3、调用存储过程时使用CALL语句,自定义函数可以像系统函数一样直接调用。

一、创建MySQL自定义函数的语法

创建MySQL自定义函数使用create function命令,该命令格式如下:

delimiter //
create function func_name([para1 type[,para2 type]...)
returns type [characteristic ...]
beginfunction_body
end //
delimiter ;

说明:
1、[delimiter //]修改默认的命令结束符为[//],函数体以[//]结束,[delimiter ;]恢复默认的结束符为[;]。
2、func_name:指定自定义函数的名称。
3、para1 type:用于指定函数的参数。参数不能指定关键字in、out和inout。
4、returns type:用于指定自定义函数返回值的数据类型。
5、function_body:自定义函数的主体,也称函数体。在存储过程中使用的SQL语句在自定义函数中也同样可以使用。此外,函数体必须包含一个RETURN语句,用于指定函数的返回值。
6、characteristic参数:指定使用SQL语句的限制。包括四种选择:
(1)CONTAINS SQL(默认值):表示子程序包含SQL语句,但不包含读或者写数据的语句;
(2)NO SQL:表示子程序不包含SQL;
(3)READS SQL DATA:表示子程序包含读数据的语句,但是不包含写数据的语句;
(4)MODIFIES SQL DATA:表示子程序包含写数据的语句。

二、自定义函数的创建举例

首先创建以下三个表:student(学生)、course(课程)、score(成绩),并输入数据:

create table student(s_id int primary key auto_increment comment '学生学号',s_name char(20) comment '学生姓名',age int comment '学生年龄',phone char(20) comment '电话'
);create table course(c_id int primary key auto_increment comment '课程编号',c_name char(20) comment '课程名称',credits int comment '课程学分'
);create table score(s_id int comment '学生学号',c_id int comment '课程编号',score int comment '成绩',primary key(s_id,c_id)
);insert into student
values(1001,'张平',20,'15937352444'),(1002,'王刚',21,'13637355888'),
(1003,'张静静',19,'13403736655'),(1004,'王涛',20,'13037388899'),
(1005,'王鹏飞',19,'13237366999');insert into course
values(1,'数据库',4),(2,'数据结构',4),(3,'管理学',3),(4,'英语',4),(5,'电子商务',3);insert into score
values(1001,1,80),(1001,2,90),(1001,3,77),(1001,4,87),(1001,5,69),
(1002,1,87),(1002,2,67),(1002,3,78),(1002,4,98),(1002,5,78),
(1003,1,66),(1003,2,77),(1003,3,88),(1003,4,99),(1003,5,66),
(1005,1,81),(1005,2,83),(1005,3,62),(1005,4,68),(1005,5,72),
(1004,1,72),(1004,2,60),(1004,3,84),(1004,4,88),(1004,5,74);

1、创建一个自定义函数,实现两个数相乘,返回乘积。

delimiter //
drop function if exists func_product;create function func_product(m decimal(10,4),n decimal(10,4))
returns decimal(20,8)  no sql
begindeclare result decimal(20,8);set result=m*n;return result;
end //
delimiter ;mysql> select func_product(1.2,5);
+----------------+
| product(1.2,5) |
+----------------+
|     6.00000000 |
+----------------+
1 row in set (0.00 sec)

2、创建一个自定义函数,输入学生的姓名和所学课程的课程编号,查询该课程的成绩。

delimiter //
drop function if exists func_query_score;create function func_query_score(student_name char(20),course_name char(20))
returns int reads sql data
beginreturn (select score from scorewhere s_id=(select s_id from student where s_name=student_name) andc_id=(select c_id from course where c_name=course_name));
end //
delimiter ;mysql> select func_query_score('张平','数据结构') as '成绩';
+--------+
| 成绩   |
+--------+
|     90 |
+--------+
1 row in set (0.01 sec)

三、自定义函数的调用

和系统函数的调用完全相同,格式如下:

select function_name(para1,para2,...);mysql> select func_product(1.2,5);
mysql> select func_query_score('张平','数据结构') as '成绩';

四、查看数据库中包含的自定义函数名称及详细信息

--格式: show function status where db='dbname';mysql> show function status where db='wanggx' and name like 'func%'\G
*************************** 1. row ***************************Db: wanggxName: func_productType: FUNCTIONDefiner: root@localhostModified: 2019-11-21 12:46:50Created: 2019-11-21 12:46:50Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
*************************** 2. row ***************************Db: wanggxName: func_query_scoreType: FUNCTIONDefiner: root@localhostModified: 2019-11-21 12:47:01Created: 2019-11-21 12:47:01Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
2 rows in set (0.00 sec)

五、查看指定的自定义函数的详细信息

--格式: show create function func_name;mysql> show create function func_query_score\G
*************************** 1. row ***************************Function: func_query_scoresql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Function: CREATE DEFINER=`root`@`localhost` FUNCTION `func_query_score`(student_name char(20),course_name char(20)) RETURNS int(11)READS SQL DATA
beginreturn (select score from scorewhere s_id=(select s_id from student where s_name=student_name) andc_id=(select c_id from course where c_name=course_name));
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)

六、修改自定义函数

delimiter //
alter function func_name([para1 type[,para2 type]...)
returns type [characteristic ...]
beginfunction_body
end //
delimiter ;

七、删除自定义函数

drop function func_name;

MySQL自定义函数创建与使用总结相关推荐

  1. MySQL自定义函数的使用及MySQL中的流程控制语句

    MySQL自定义函数 文章目录 MySQL自定义函数 创建自定义函数 自定义函数的调用 自定义函数的删除 自定义函数的维护 流程控制语句 条件控制语句 循环语句 创建自定义函数 创建自定义函数时, 开 ...

  2. 数据库系列之mysql 自定义函数function,函数和存储过程的区别

    mysql 自定义函数function,函数和存储过程的区别 https://blog.csdn.net/u010365819/article/details/80470448 https://blo ...

  3. mysql 自定义函数function,函数和存储过程的区别

    From: https://blog.csdn.net/u010365819/article/details/80470448 1.MySQL自定义函数简介 在MySQL中使用自定义函数也需要相应的要 ...

  4. mysql 自定义函数入门_【转】MYSQL入门学习之十三:自定义函数的基本操作

    转载地址:http://www.2cto.com/database/201212/177382.html 一.自定义函数(UDF)的特性和功能  www.2cto.com 函数能分返回字符串,整数或实 ...

  5. mysql 自定义函数教程_MySQL自定义函数

    MySQL自定义函数 函数与存储过程类似,也是一组预先编译好的SQL语句的集合,但是存储过程可以有0个或多个返回,函数就只能有一个返回 创建函数 #语法 参数列表包含两部分 参数名和参数类型 #函数体 ...

  6. MySQL自定义函数(四十六)

    MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...

  7. mysql自定义函数实现

    mysql自定义函数实现 环境准备 查看mysql版本 select version(); 查看mysql存储引擎 show variables like '%storage_engine%'; 创建 ...

  8. MySql自定义函数的定义和使用

    1.MySQL自定义函数简介 在MySQL中使用自定义函数也需要相应的要求,语法如下, 创建新函数: Create function function_name(参数列表) returns返回值类型 ...

  9. mysql自定义函数-随机生成人员姓名

    ​   由于对自定义函数的使用比较少,这里仅做个记录,方便以后使用的时候直接从这里面进行摘录使用. 创建自定义函数 -- mysql自定义函数-随机生成姓名 DELIMITER $$ DROP FUN ...

最新文章

  1. 转 小辉_Ray CORS(跨域资源共享)
  2. 天池大赛 + CV语义分割 + 78万奖金:全国数字生态创新大赛来了!
  3. Docker Compose 配置文件详解
  4. Spring对Hibernate事务管理
  5. 超适合新手的Oracle查询语句
  6. bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
  7. Nacos配置中心规范
  8. Python高级——闭包与装饰器
  9. 游戏开发引擎 Cryengine 在 GitHub 上公开全部源代码
  10. AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止)
  11. 群晖 上传 源文件不存在_群晖NAS配多大容量硬盘合适?
  12. 360 RePlugin 初探
  13. java重载父类方法_子类重载父类方法
  14. c语言程序答案PDF,C语言程序设计答案.pdf
  15. linux下磁盘坏道修复,linux磁盘坏道修复记录
  16. 警惕非上架应用的下载和使用
  17. 网络安全学习:系统基础命令操作
  18. linkerd mysql_《Linkerd官方文档》在本地运行Linkerd
  19. 树莓派CSI摄像头使用
  20. 已解决Building wheels for collected packages: lxml

热门文章

  1. python 字典的学习
  2. 数据挖掘中最容易犯的几个错误,你知道吗?
  3. Flink_企业级风控平台架构建设_01
  4. dbcontext的使用
  5. 主题建模-corpora语料库-PCA进行降维
  6. 素数筛线性筛详细详解(个人总结思路超长版)
  7. 阿里最新春招面经,腾讯 / 美团 / 字节 1 万道 Java 中高级面试题
  8. mysql数据库物理结构_MySQL数据库结构设计(物理设计)
  9. python爬山算法
  10. oracle文件系统挂载点,挂载和取消挂载文件系统概述