MySQL全面瓦解18:自定义函数
定义
我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求。
但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函数。
所以,函数是指 一组预编译好的sql语句集合,理解成批处理语句。类似于C# 中的方法,并且必须有返回值。
调用函数就是一次性执行这些语句。所以函数可以降低语句重复。【但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合。】
作用
1、可以高度抽象业务逻辑,前置到数据库层面,而不是应用层面
2、相比于从数据库查询出来,然后程序操作数据,数据库操作一定程度上提高效率。
3、高度可复用性,数据库层面的方法封装,不只是应用在多个同样业务场景。还可以应用到多个不同语言中。
函数的使用
创建函数
1 CREATE FUNCTION func_name(param_list) RETURNS TYPE
2 BEGIN
3 -- Todo:function body
4 END
1、param_list指的是参数列表,参数是可选的,可以不带参数,也可以带多个参数。参数 包含两部分:参数名 参数类型。
2、函数返回值是必选项,但是只允许返回一个值,不允许返回一个结果集(官方原文:Not allowed to return a result set from a function)。函数强调返回值,所以函数不允许返回多个值的情况,即使是查询语句。这是他会跟存储过程的区别。
3、函数体中如果有多个语句,使用begin end 包含
4、使用 delimiter语句设置结束标记 */
调用函数
SELECT func_name(param_list);
查看函数
1 SHOW FUNCTION STATUS;
查看函数创建脚本
1 SHOW CREATE FUNCTION func_name;
删除函数
1 DROP FUNCTION IF EXISTS func_name;
示例
数据基础
1 mysql> select * from students;
2 +-----------+-------------+-------+---------+
3 | studentid | studentname | score | classid |
4 +-----------+-------------+-------+---------+
5 | 1 | brand | 105.5 | 1 |
6 | 2 | helen | 98.5 | 1 |
7 | 3 | lyn | 97 | 1 |
8 | 4 | sol | 97 | 1 |
9 | 5 | b1 | 89 | 2 |
10 | 6 | b2 | 90 | 2 |
11 | 7 | c1 | 76 | 3 |
12 | 8 | c2 | 73.5 | 3 |
13 | 9 | lala | 73 | 0 |
14 | 10 | A | 100 | 3 |
15 | 16 | test1 | 100 | 0 |
16 | 17 | trigger2 | 107 | 0 |
17 | 22 | trigger1 | 100 | 0 |
18 +-----------+-------------+-------+---------+
19 13 rows in set
无参函数
获取有班级号的所有同学的平均成绩
1 /*如果存在函数func_test1,则删除*/
2 DROP FUNCTION IF EXISTS fun_test1;
3 /*声明结束符为$*/
4 DELIMITER $
5 /*创建函数*/
6 CREATE FUNCTION fun_test1()
7 RETURNS DECIMAL(10,2)
8 BEGIN
9 DECLARE avg_score DECIMAL(10,2) DEFAULT 0;
10 SELECT AVG(score) INTO avg_score FROM students where classid<>0;
11 return avg_score;
12 END $
13 /*重置结束符为;*/
14 DELIMITER ;
1 mysql> select fun_test1();
2 +-------------+
3 | fun_test1() |
4 +-------------+
5 | 91.83 |
6 +-------------+
7 1 row in set
有参函数
获取班级号为1的同学的平均成绩
1 /*如果存在函数func_test2,则删除*/
2 DROP FUNCTION IF EXISTS fun_test2;
3 /*声明结束符为$*/
4 DELIMITER $
5 /*创建函数*/
6 CREATE FUNCTION fun_test2(cid INT)
7 RETURNS DECIMAL(10,2)
8 BEGIN
9 DECLARE avg_score DECIMAL(10,2) DEFAULT 0;
10 SELECT AVG(score) INTO avg_score FROM students where classid=cid;
11 return avg_score;
12 END $
13 /*重置结束符为;*/
14 DELIMITER ;
1 mysql> select fun_test2(1);
2 +--------------+
3 | fun_test2(1) |
4 +--------------+
5 | 99.5 |
6 +--------------+
7 1 row in set
查看函数信息
1 mysql> SHOW FUNCTION STATUS;
2 +------+-----------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
3 | Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
4 +------+-----------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
5 | test | fun_test | FUNCTION | root@localhost | 2021-01-15 16:37:50 | 2021-01-15 16:37:50 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
6 | test | fun_test1 | FUNCTION | root@localhost | 2021-01-16 11:59:40 | 2021-01-16 11:59:40 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
7 | test | fun_test2 | FUNCTION | root@localhost | 2021-01-16 12:00:27 | 2021-01-16 12:00:27 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
8 +------+-----------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
9 3 rows in set
查看函数创建脚本
1 mysql> show create function fun_test2;
2 +-----------+--------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
3 | Function | sql_mode | Create Function | character_set_client | collation_connection | Database Collation |
4 +-----------+--------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
5 | fun_test2 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `fun_test2`(cid INT) RETURNS decimal(10,2)
6 BEGIN
7 DECLARE avg_score DECIMAL(10,2) DEFAULT 0;
8 SELECT AVG(score) INTO avg_score FROM students where classid=cid;
9 return avg_score;
10 END | utf8 | utf8_general_ci | latin1_swedish_ci |
11 +-----------+--------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
12 1 row in set
删除函数
1 mysql> DROP FUNCTION IF EXISTS fun_test2;
2 Query OK, 0 rows affected
3
4 mysql> select fun_test2(1);
5 1305 - FUNCTION test.fun_test2 does not exist
小结
存储过程和函数的区别
存储过程的关键字为procedure,返回值可以有多个,调用时用call,一般用于执行比较复杂的的过程体、更新、创建等语句。
函数的关键字为function,返回值必须有一个,调用用select,一般用于查询单个值并返回。
存储过程 | 函数 | |
---|---|---|
返回值 | 可以有0个或者多个 | 必须有一个 |
关键字 | procedure | function |
调用方式 | call | select |
MySQL全面瓦解18:自定义函数的更多相关文章
- MySQL(10)---自定义函数
MySQL(10)---自定义函数 之前讲过存储过程,存储过程和自定义函数还是非常相似的,其它的可以认为和存储过程是一样的,比如含义,优点都可以按存储过程的优点来理解. 存储过程相关博客: 1.MyS ...
- 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)
hi 感觉论文开题基本确定了,凯森 1.MySQL -----自定义函数----- ----基本 两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有) 函数体:合法的SQL语句:以 ...
- mysql 总结二(自定义函数)
本质:mysql内置函数的一种扩展,本质上与mysql内置函数一样. 函数必要条件: @1:参数(非必备): @2:返回值: 模板: create function function_name ret ...
- MYSQL数据库重点:自定义函数、存储过程、触发器、事件、视图
一.自定义函数 mysql自定义函数就是实现程序员需要sql逻辑处理,参数是IN参数,含有RETURNS字句用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句. 语法: 创建: ...
- MySQL存储过程/存储过程与自定义函数的区别
语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...
- (转)MySQL存储过程/存储过程与自定义函数的区别
转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}] ...
- 【存储过程】MySQL存储过程/存储过程与自定义函数的区别
---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...
- MySQL基于实例sales创建自定义函数、视图、存储过程及触发器
实例:数据库sales 1.客户表(Customer) 客户编号(CusNo) 姓名(CusName) 地址(Address) 电话(Tel) C001 杨婷 北京 010-5328953 C002 ...
- 数据库Mysql的学习(七)-自定义函数和流程控制
DELIMITER // (设置结束符 其实我也不太明白为啥要这样 记住就行把) CREATE FUNCTION ym_date(mydate DATE) (创建函数 函数名字(参数)) ) (指定函 ...
随机推荐
- 服务器标配 SSH 协议,你了解多少?
年初,新冠肺炎疫情的出现,全国数千万名员工在家远程办公,使用个人设备通过家庭网络访问公司资料.因此,IT 安全团队面临了众多新挑战:如何实施更加安全的身份验证方案,以确保只有授权人员和设备才能访问公司 ...
- ORA-28017: The password file is in the legacy format
1.数据库升级后修改sys密码报错. 一般从oracle 从11G(11.2.0.4)升级到12C或者19C,修改SYS密码会有以下报错: ORA-28017: The password file i ...
- Codis集群相关
在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...
- 附028.Kubernetes_v1.20.0高可用部署架构二
目录 kubeadm介绍 kubeadm概述 kubeadm功能 本方案描述 部署规划 节点规划 初始准备 互信配置 其他准备 集群部署 相关组件包 正式安装 部署高可用组件I Keepalived安 ...
- Asp.net Core3.1+Vue 使用SignalR推送数据
本文就简单使用 往前端页面推送消息 SignalR 是什么 SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Serv ...
- 【基础】:Rsync数据同步工具
第二十一节 Rsync数据同步工具 1.1 Rsync介绍 1.1.1 什么是Rsync? 1.1.2 Rsync简介 1.3 Rsync的特性 1.1.4 Rsync的企业工作场景说明 1.2 Rs ...
- 【程序包管理】篇章3:CentOS平台下软件包安装方法总结
1.软件包安装前的学习:程序包管理的基础知识 2.程序包安装的方法介绍: rpm文件的二进制包安装:Linux程序包管理之rpm安装总结 yum安装:Linux程序包管理之yum源安装 链接:本地yu ...
- (十三)、向shell脚本中传参
一.向脚本中传递位置参数 向脚本中传递参数的数目理论上可以无数多,但是只有前9个能被访问,使用shift可以改变此限制 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 脚本名字 first ...
- 容器编排系统K8s之访问控制--用户认证
前文我们聊到了k8s的statefulset控制器相关使用说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14201103.html:今天我们来聊一下k8 ...
- 万恶的NPE差点让我半个月工资没了
引言 最近看到<阿里巴巴Java开发手册>(公众号回复[开发手册]免费获取)第11条规范写到: 防止 NPE ,是程序员的基本修养 NPE(Null Pointer Exception)一 ...