函数与存储过程的作用类似,但与存储过程相比,函数有如下不同:

  • 函数有且仅有一个返回值,适合做处理后返回一个结果的业务
  • 参数列表仅包含两个部分:参数名和参数类型

创建函数

语法:

  1. create function 函数名(参数列表) returns 返回值的类型
  2. begin
  3. 函数体
  4. end

注意:

  1. 函数体中必须有 return 语句,否则会报错。
  2. return 语句没有放在函数体的最后是不会报错的,但不推荐这么做。
  3. 若函数体中只有一句指令,则可省略 BEGIN END
  4. 使用 delimiter 设置函数的结束标记。

    调用函数

语法:

  1. select 函数名(参数列表);

案例演示

  1. 无参有返回

例子:获取总员工个数

  1. delimiter $
  2. create function myf1() returns int
  3. begin
  4. declare c int default 0;
  5. select count(*) into c
  6. from employees;
  7. return c;
  8. end $
  9. delimiter ;
  10. select myf1();

Q:什么时候变量名前加@,什么时候不加?

结果:

  1. MariaDB [myemployees]> select myf1();
  2. +--------+
  3. | myf1() |
  4. +--------+
  5. | 107 |
  6. +--------+
  7. 1 row in set (0.002 sec)
  1. 有参有返回

例子:根据部门名,返回部门员工的平均工资

  1. delimiter $
  2. create function myf2(deptName varchar(20)) returns double
  3. begin
  4. set @avg_sal=0;
  5. select avg(salary) into @avg_sal
  6. from departments d
  7. left join employees e on d.department_id=e.department_id
  8. where d.department_name=deptName;
  9. return @avg_sal;
  10. end $
  11. delimiter ;
  12. select myf2('Adm');

结果:

  1. MariaDB [myemployees]> select myf2('Adm');
  2. +-------------+
  3. | myf2('Adm') |
  4. +-------------+
  5. | 4400 |
  6. +-------------+
  7. 1 row in set (0.003 sec)

函数的查看与删除

查看函数的语法:

  1. show create function 函数名;

删除函数的语法:

  1. drop function 函数名;