二八佳人体似酥,腰悬利剑斩愚夫,虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了 MySQL存储过程(二十四),如果没有看过,请观看上一章
前面学习了很多函数,使用这些函数可以对数据进行的各种处理操作,极大地提高用户对数据库的管理效率。
MySQL支持自定义函数,定义好之后,调用方式与调用MySQL预定义的系统函数一样。
一. 语法 分析
学过的函数:LENGTH、SUBSTR、CONCAT等
语法格式:
CREATE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型
[characteristics ...]
BEGIN
函数体 #函数体中肯定有 RETURN 语句
END
说明:
1、参数列表:指定参数为IN、OUT或INOUT只对PROCEDURE是合法的,FUNCTION中总是默认为IN参数。
2、RETURNS type 语句表示函数返回数据的类型;
RETURNS子句只能对FUNCTION做指定,对函数而言这是强制
的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value
语句。
3、characteristic 创建函数时指定的对函数的约束。取值与创建存储过程时相同,这里不再赘述。
4、函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END。
一.一 创建一个无参的函数
DELIMITER //
CREATE FUNCTION f1()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
-- sql 语句里面没有 ;号
RETURN (select email from auth_user where username = 'admin');
END //
DELIMITER ;
-- 调用 1290513799@qq.com
select f1();
一.二 创建一个有参的函数
参数都是 IN
DELIMITER //
CREATE FUNCTION f2(s_username varchar(100))
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
-- sql 语句里面没有 ;号
RETURN (select email from auth_user where username = s_username);
END //
DELIMITER ;
-- 1290513799@qq.com
select f2('admin');
-- 空
select f2('yjl');
一.三 多个参数
DELIMITER //
CREATE FUNCTION f3(s_username varchar(100), s_id INT)
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
-- sql 语句里面没有 ;号
RETURN (select email from auth_user where username = s_username and id = s_id);
END //
DELIMITER ;
-- 1290513799@qq.com
select f3('admin',1);
-- 空
select f3('admin',2);
一.四 带有聚集函数的
DELIMITER //
CREATE FUNCTION selectMaxId()
RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
COMMENT '查询目前记录中最大的id'
BEGIN
RETURN (SELECT max(id) FROM auth_user);
END //
DELIMITER ;
-- 4
select selectMaxId();
二. 存储函数用法
二.一 调用存储函数 select
在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。换言之,用户自己定义的存储函数与MySQL内部函数是一个性质的。区别在于,存储函数是用户自己定义
的,而内部函数是MySQL的开发者定义
的。
select selectMaxId();
select f3('admin',2);
二.二 查询存储函数
SHOW CREATE FUNCTION 存储函数名
show create FUNCTION f1;
从information_schema.Routines表中查看存储过程和函数的信息
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='f1' AND ROUTINE_TYPE = 'FUNCTION';
二.三 删除存储函数
DROP FUNCTION [IF EXISTS] 存储函数名
-- 删除
drop FUNCTION if EXISTS f1;
-- 删除之后再查询就查询不到了
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='f1' AND ROUTINE_TYPE = 'FUNCTION';
二.四 展示库里面所有的存储函数
SHOW FUNCTION STATUS;
可以通过 Db(库) 和 Name (存储过程名) 进行筛选查询
二.五 修改存储函数
建议先删除,再重新创建。
三. 对比存储函数和存储过程
关键字 | 调用语法 | 返回值 | 应用场景 | |
---|---|---|---|---|
存储过程 | PROCEDURE | CALL 存储过程() | 理解为有0个或多个 | 一般用于更新 |
存储函数 | FUNCTION | SELECT 函数() | 只能是一个 | 一般用于查询结果为一个值并返回时 |
此外,存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更加强大,包括能够执行对表的操作(比如创建表,删除表等)和事务操作,
这些功能是存储函数不具备的。
谢谢!!!