2024-04-04  阅读(3)
原文作者:Brand 原文地址: https://www.cnblogs.com/wzh2010/p/13843095.html

定义

我们之前学习了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] ,回复【面试题】 即可免费领取。

阅读全文