MySQL学习-存储函数

108 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

前言

上篇我们学习了一部分MySQL中的存储过程。有兴趣的小伙伴可以阅读(# MySQL学习-存储过程(三)-创建与调用存储过程)。
下面继续学习MySQL中的存储函数。

存储函数

前面的文章总结了很多篇关于函数的定义以及使用,使用这些函数可以对数据进行各种处理操作。除了MySQL提供的函数之外,还支持自定义函数,定义好后,调用方式与调用MySQL预定义的系统函数一样。

语法

格式

CREATE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型
[characteristics ...]
BEGIN
    函数体 #函数体中肯定有RETURN语句
END

说明

  1. 参数列表:指定参数为IN、OUT或INOUT支队PRODUCEDURE是合法的,FUNCTION中总是默认为IN参数。
  2. RETURNS type语句表示函数返回数据的类型 RETURNS语句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。
  3. characteristics创建函数时指定的对函数的约束。取值与创建存储过程时相同,这里不再赘述。
  4. 函数体也可以用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);

存储过程与存储函数的异同

关键字调用语法返回值应用场景
存储过程PROCEDURECALL 存储过程有0或多个返回值一般用于更新
存储函数FUNCTIONSELECT 存储函数只能有1个返回值一般用于查询结果为一个值并返回时

此外,存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更加强大,包括能够执行对表的操作(比如创建表,删除表等)和事务操作,这些功能存储函数不能操作。

今天先学习到这里,明天继续。