MySQL之函数

什么是函数

介绍:

  经过预先编译并存储在数据库中的一段SQL语句的集合,理解成批处理语句。

好处:

  1. 提高了sql语句的重用性,减少了开发人员的压力。

  2. 减少数据在数据库和应用服务器之间的传输。

  3. 提高了数据处理的效率。

函数和存储过程的区别:

  函数:

    关键字:FUNCTION

    调用语法:SELECT 函数()

    返回值:只能是一个。

    应用场景:一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个。

  存储过程: 

    关键字:PROCEDURE

    调用语法:CALL 存储过程()

    返回值:可以有0个或多个

    应用场景:一般用于做批量插入、批量更新。

创建函数

语法:

  CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型

  BEGIN

    函数体

  END

参数列表:

  参数名 参数类型

设置新的结束标记:  

  delimiter 新的结束标记(例如:delimiter $

代码示例:

delimiter $

CREATE FUNCTION 函数名(参数名  参数类型,...) RETURNS 返回类型
BEGIN

    函数体
    return 值;

END $

提示:

函数体肯定会有return语句,如果没有会报错,如果return语句没有放在函数体的最后也不报错,但不建议。

函数体中仅有一句话,则可以省略begin end

调用函数

语法:

  SELECT 函数名(参数列表);

代码示例:

/*
 * 1.无参有返回
 */
#案例:返回公司的员工个数
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN

    DECLARE c INT DEFAULT 0;#定义局部变量
    SELECT COUNT(*) INTO c#赋值
    FROM employees;
    RETURN c;
    
END $
#调用
SELECT myf1()$


/*
 * 2.有参有返回
 */
#案例1:根据员工名,返回它的工资
DELIMITER $
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN

    SET @sal=0;#定义用户变量 
    SELECT salary INTO @sal   #赋值
    FROM employees
    WHERE last_name = empName;
    
    RETURN @sal;
END $
#调用
SELECT myf2('k_ing') $

#案例2:根据部门名,返回该部门的平均工资
DELIMITER $
CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN

    DECLARE sal DOUBLE ;
    SELECT AVG(salary) INTO sal
    FROM employees e
    JOIN departments d ON e.department_id = d.department_id
    WHERE d.department_name=deptName;
    RETURN sal;

END $
#调用
SELECT myf3('IT')$

#案例3:实现传入两个float,返回二者之和
DELIMITER $
CREATE FUNCTION myf4(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN

    DECLARE SUM FLOAT DEFAULT 0;
    SET SUM = num1 + num2;
    RETURN SUM;

END $
#调用
SELECT myf4(1,2)$

查看函数

语法:

  SHOW CREATE FUNCTION 函数名;

代码示例:

SHOW CREATE FUNCTION myf3;

删除函数

语法:

  DROP FUNCTION 函数名;

代码示例:

DROP FUNCTION myf3;