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

定义

咱们以前学习了MySQL的内置函数,传送门,很是丰富,知足了咱们对数据操做的大部分需求。html

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

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

做用

一、能够高度抽象业务逻辑,前置到数据库层面,而不是应用层面数据库

二、相比于从数据库查询出来,而后程序操做数据,数据库操做必定程度上提升效率。函数

三、高度可复用性,数据库层面的方法封装,不仅是应用在多个一样业务场景。还能够应用到多个不一样语言中。学习

函数的使用

建立函数

1 CREATE FUNCTION func_name(param_list) RETURNS TYPE
2 BEGIN
3      -- Todo:function body
4 END 

一、param_list指的是参数列表,参数是可选的,能够不带参数,也能够带多个参数。参数 包含两部分:参数名 参数类型。
二、函数返回值是必选项,可是只容许返回一个值,不容许返回一个结果集(官方原文:Not allowed to return a result set from a function)。函数强调返回值,因此函数不容许返回多个值的状况,即便是查询语句。这是他会跟存储过程的区别。
三、函数体中若是有多个语句,使用begin end 包含 
四、使用 delimiter语句设置结束标记 */ spa

调用函数

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 
无参函数

获取有班级号的全部同窗的平均成绩code

 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 调用,无需传入参数htm

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

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

 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
相关文章
相关标签/搜索