MySQL自定义函数

自定义函数

  • 自定义函数和存储过程很像, 只不过自定义函数不需要手动通过call调用
  • 而是和其它的聚合函数一样会在SQL语句中自动被调用
  • 例如: select avg(score) from stu;
  • 例如: select count(*) from stu where age >=18;

创建自定义函数

create function 函数名(形参列表) returns 数据类型 函数特征
begin
	sql语句;
	... ...
	return 值;
end;

函数特征

  1. DETERMINISTIC: 不确定的
  2. NO SQL 没有SQl语句,当然也不会修改数据
  3. READS SQL DATA 只是读取数据,不会修改数据
  4. MODIFIES SQL DATA 要修改数据
  5. CONTAINS SQL 包含了SQL语句

调用函数

select 函数名称(参数) from dual;
create function fn_add(a int, b int) returns int DETERMINISTIC
begin
    declare sum int default 0;
    set sum = a + b;
    return sum;
end;
create function check_stu(stuId int) returns varchar(255) DETERMINISTIC
begin
    declare stuName varchar(255) default '';
    select name into stuName from stu where id=stuId;
    return stuName;
end;

查看函数

查看所有函数

show function status;

查看指定数据库中的函数

show function status where db='db_name';

查看函数源代码

show create function show_stu;

删除函数

drop function show_stu;

IF语句

if 条件表达式 then
... ...
elseif 条件表达式 then
... ...
else
... ...
end if;
create function fn_test(age int) returns varchar(255) DETERMINISTIC
begin
declare result varchar(255) default '';
if age >= 18 then
set result = '成年人';
else
set result = '未成年人';
end if;
return result;
end;
create function fn_test2(score int) returns varchar(255) DETERMINISTIC
begin
declare result varchar(255) default '';
if score < 0 || score > 100 then
set result = '没有这个分数';
elseif score < 60 then
set result = '不及格';
elseif score < 80 then
set result = '良好';
else
set result = '优秀';
end if;
return result;
end;

CASE语句

case
when 条件表达式 then
... ...
when 条件表达式 then
... ...
end case;
create function fn_test3(score int) returns varchar(255) DETERMINISTIC
begin
declare result varchar(255) default '';
case
when score=100 then
set result = '还需努力';
when score=0 then
set result = '不需要努力了';
end case;
return result;
end;

循环语句

while 条件表达式 do
	... ...
end while;

1 + n 的和 1 + 2 + 3 + 4 + 5

create function fun_test4(num int)returns int DETERMINISTIC
begin
    declare sum int default 0;
    declare currentIndex int default 1;

    while currentIndex <= num do
        set sum = sum + currentIndex;
        set currentIndex = currentIndex + 1;
    end while;

    return sum;
end;
repeat
... ...
until 条件表达式 end repeat;
create function fun_test6(num int)returns int DETERMINISTIC
begin
    declare sum int default 0;
    declare currentIndex int default 1;

    repeat
        set sum = sum + currentIndex;
        set currentIndex = currentIndex + 1;
    until currentIndex > num end repeat;

    return sum;
end;
posted @ 2020-09-03 14:14  BNTang  阅读(508)  评论(0编辑  收藏  举报