定义
我们之前学习了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个或者多个 | 必须有一个 |
关键字 | procedure | function |
调用方式 | call | select |
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。