咱们以前学习了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 |