携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
前言
上篇我们学习了一部分MySQL中的存储过程。有兴趣的小伙伴可以阅读(# MySQL学习-存储过程(三)-创建与调用存储过程)。
下面继续学习MySQL中的存储函数。
存储函数
前面的文章总结了很多篇关于函数的定义以及使用,使用这些函数可以对数据进行各种处理操作。除了MySQL提供的函数之外,还支持自定义函数,定义好后,调用方式与调用MySQL预定义的系统函数一样。
语法
格式
CREATE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型
[characteristics ...]
BEGIN
函数体 #函数体中肯定有RETURN语句
END
说明
- 参数列表:指定参数为IN、OUT或INOUT支队PRODUCEDURE是合法的,FUNCTION中总是默认为IN参数。
- RETURNS type语句表示函数返回数据的类型 RETURNS语句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。
- characteristics创建函数时指定的对函数的约束。取值与创建存储过程时相同,这里不再赘述。
- 函数体也可以用BEGIN...END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN...END
调用存储函数
在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。
SELECT 函数名(实参列表)
举例一
创建存储函数email_by_xiaoming(),参数为空,查询xiaoming的email,并返回,数据类型为字符串。
DELIMITER //
CREATE FUNCTION email_by_xiaoming()
RETURN VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
RETURN (
SELECT email
FROM employees
WHERE name = 'xiaoming'
);
END //
DELIMITER ;
SELECT email_by_xiaoming();
这样就可以查出xiaoming的email。
举例二
创建存储函数email_by_name(),参数传入emp_name,查询emp_name的email,并返回,数据类型为字符串类型。
DELIMITER //
CREATE FUNCTION email_by_name(emp_name VARCHAR(25))
RETURN VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
RETURN (
SELECT email
FROM employees
WHERE name = emp_name
);
END //
DELIMITER ;
SET @emp_name = 'xiaoming';
SELECT email_by_name(@emp_name);
这样也可以查出xiaoming的email。
举例三
创建存储函数count_by_id(),参数传入dept_id,返回dept_id的员工人数,并返回,返回类型为整型。
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURN INT
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
COMMENT '查询部门人数'
BEGIN
RETURN (
SELECT COUNT(*)
FROM employees
WHERE department_id = dept_id
);
END //
DELIMITER ;
SET @dept_id = 10;
SELECT count_by_id(@dept_id);
存储过程与存储函数的异同
| 关键字 | 调用语法 | 返回值 | 应用场景 | |
|---|---|---|---|---|
| 存储过程 | PROCEDURE | CALL 存储过程 | 有0或多个返回值 | 一般用于更新 |
| 存储函数 | FUNCTION | SELECT 存储函数 | 只能有1个返回值 | 一般用于查询结果为一个值并返回时 |
此外,存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更加强大,包括能够执行对表的操作(比如创建表,删除表等)和事务操作,这些功能存储函数不能操作。
今天先学习到这里,明天继续。