mysql实验6.2自定义函数_MySQL全面瓦解18:自定义函数

定义

我们之前学习了MySQL的内置函数,传送门,非常丰富,满足了我们对数据操作的大部分需求。

但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函数。

所以,函数是指 一组预编译好的sql语句集合,理解成批处理语句,类似于C# 中的方法,但是必须有返回值。调用函数等于一次性执行了这些语句,有利降低语句重复编写和调用。

作用

1、可以高度抽象业务逻辑,前置到数据库层面,而不是应用层面

2、相比于从数据库查询出来,然后程序操作数据,数据库操作一定程度上提高效率。

3、高度可复用性,数据库层面的方法封装,不只是应用在多个同样业务场景。还可以应用到多个不同语言中。

函数的使用

创建函数

1 CREATE FUNCTION func_name(param_list) RETURNSTYPE2 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 * fromstudents;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 EXISTSfun_test1;3 /*声明结束符为$*/

4 DELIMITER $5 /*创建函数*/

6 CREATE FUNCTIONfun_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 returnavg_score;12 END$13 /*重置结束符为;*/

14 DELIMITER ;

使用 select 调用,无需传入参数

1 mysql> selectfun_test1();2 +-------------+

3 | fun_test1() |

4 +-------------+

5 | 91.83 |

6 +-------------+

7 1 row in set

有参函数

获取班级号为1的同学的平均成绩,参数cid 为班级号

1 /*如果存在函数func_test2,则删除*/

2 DROP FUNCTION IF EXISTSfun_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 returnavg_score;12 END$13 /*重置结束符为;*/

14 DELIMITER ;

使用 select 调用,传入参数1

1 mysql> select fun_test2(1);2 +--------------+

3 | fun_test2(1) |

4 +--------------+

5 | 99.5 |

6 +--------------+

7 1 row in set

查看函数信息

1 mysql> SHOW FUNCTIONSTATUS;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 functionfun_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 returnavg_score;10 END | utf8 | utf8_general_ci | latin1_swedish_ci |

11 +-----------+--------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+

12 1 row in set

删除函数

1 mysql> DROP FUNCTION IF EXISTSfun_test2;2 Query OK, 0rows affected3

4 mysql> select fun_test2(1);5 1305 - FUNCTION test.fun_test2 does not exist

小结

存储过程和函数的区别

存储过程的关键字为procedure,返回值可以有多个,调用时用call,一般用于执行比较复杂的的过程体、更新、创建等语句。

函数的关键字为function,返回值必须有一个,调用用select,一般用于查询单个值并返回。

行为

存储过程

函数

返回值

可以有0个或者多个

必须有一个

关键字

procedure

function

调用方式

call

select

发表评论

评论已关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值