MySQL全面瓦解18:自定义函数

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

定义

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

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

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

作用

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 ;

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

    1 mysql> select fun_test1();
    2 +-------------+
    3 | fun_test1() |
    4 +-------------+
    5 | 91.83       |
    6 +-------------+
    7 1 row in set 

有参函数

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

     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 ;

使用 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 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个或者多个必须有一个
关键字procedurefunction
调用方式callselect

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值