MYSQL--自定义函数
什么是函数
- 函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。【但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合。】
- mysql函数有自己的自定义函数(已经定义好了的函数)
函数跟存储过程区别
- 函数与存储过程的区别:函数只会返回一个值,不允许返回一个结果集。函数强调返回值,所以函数不允许返回多个值的情况,即使是查询语句
如何操作自定义函数
函数的创建
delimiter 自定义符号 -- 如果函数体只有一条语句, begin和end可以省略, 同时delimiter也可以省略
create function 函数名(形参列表) returns 返回类型 -- 注意是retruns
begin
函数体 -- 函数内定义的变量如:set @x = 1; 变量x为全局变量,在函数外面也可以使用
返回值
end
自定义符号
delimiter ;
语法注意:
这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";“为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将”;"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
过程体的开始与结束使用BEGIN与END进行标识。
示例演示
- 简化版
create function 函数名([参数列表]) returns 数据类型
begin
函数体(sql语句);
return 值;
end;
- 参数列表的格式是: 变量名 数据类型
- 示例
- 无参函数
-- 最简单的仅有一条sql的函数
create function myselect2() returns int return 666;
select myselect2(); -- 调用函数
其中begin和end是可以省略的
- 比如,查询当前日期并将其按照年月日进行格式化
create function f1() returns nvarchar(30)
return date_format(now(),'%Y年%m月%d日');
!!!注意!!!
通常往mysql数据库插入中文的时候会报错
mysql> select f2();
ERROR 1366 (HY000): Incorrect string value: '\xC4\xEA09\xD4\xC2...' for column 'f2()' at row 1
这里建议将上述创建函数中返回值由varchar改为nvarchar即可
- 有参函数(传入两值,然后求和除以2),将结果返回
create function f2(num1 int,num2 int)
returns float(10,2)
return (num1+num2)/2;
- 创建具有复合结构函数体的自定义函数
- 以student表为例,创建插入一条数据返回其id值得复合函数体得自定义函数
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
delimiter //
create function f4(a int(11),b varchar(11),c int(11),d int(11)) returns int(11)
begin
insert into student(id,name,age,sex) values(a,b,c,d);
return last_insert_id();
end
//
delimiter;
!!!关于函数体!!!
- 函数体由合法的sql语句构成
- 函数体可以是简单的SELECT或者INSERT语句构成
- 函数体如果是复合结构则使用BEGIN…END语句
- 复合结构可以包含声明、循环、控制结构
函数的调用
- 直接使用函数名()就可以调用 【虽然这么说,但返回的是一个结果,sql中不使用select的话任何结果都无法显示出来(所以单纯调用会报错),】
- 如果想要传入参数可以使用函数名(参数),如果没有参数,可以直接写函数名
- 调用方式【下面调用的函数都是上面中创建的。】
-- 无参调用
select myselect3();
-- 传参调用(以上述有参函数为例)
select f2(10,15);
+-----------+
| f2(10,15) |
+-----------+
| 12.50 |
+-----------+
函数的查看
- 查看函数创建语句:show create function 函数名;
- 查看所有函数:show function status [like ‘pattern’];
函数的修改
- 函数的修改只能修改一些如comment的选项,不能修改内部的sql语句和参数列表。
- alter function 函数名 选项;
函数的删除
- drop function 函数名;