MySQL 允许用户定义自己的函数,这些函数可以像内置函数一样在 SQL 查询中使用。自定义函数可以帮助简化复杂的计算、数据转换或者重复的逻辑。
在 MySQL 中创建自定义函数,通常需要以下几个步骤:
创建自定义函数
定义函数
使用 CREATE FUNCTION
语句来定义函数,指定函数的名称、参数以及函数体(即函数执行的逻辑)。
DELIMITER //
CREATE FUNCTION hello_world()
RETURNS VARCHAR(50)
BEGIN
DECLARE message VARCHAR(50);
SET message = 'Hello, World!';
RETURN message;
END //
DELIMITER ;
上面的示例定义了一个名为 hello_world
的简单函数,它不接收参数并返回一个字符串。
DELIMITER
用于改变语句分隔符,因为函数体中可能包含多条 SQL 语句,需要指定一个非常用的分隔符(这里用//
)。CREATE FUNCTION
语句定义了函数的名称、返回类型 (RETURNS VARCHAR(50)
) 和函数体。DECLARE
用于声明变量,这里声明了一个message
变量来存储要返回的消息。RETURN
语句用于返回结果。
定义参数化函数
你也可以定义带有参数的函数:
DELIMITER //
CREATE FUNCTION add_numbers(a INT, b INT)
RETURNS INT
BEGIN
DECLARE result INT;
SET result = a + b;
RETURN result;
END //
DELIMITER ;
这个示例定义了一个 add_numbers
函数,接收两个整数参数并返回它们的和。
调用自定义函数
定义完函数后,可以像调用内置函数一样在 SQL 查询中调用它们:
SELECT hello_world(); -- 输出 'Hello, World!'
SELECT add_numbers(3, 5); -- 输出 8
删除自定义函数
如果需要删除一个已经存在的自定义函数,可以使用 DROP FUNCTION
语句:
DROP FUNCTION IF EXISTS hello_world;
这会删除名为 hello_world
的函数,如果该函数不存在则不会报错。
注意事项:
- 自定义函数中可以包含流程控制语句(如
IF...ELSE
、CASE
等)、循环语句和 SQL 查询语句。 - 函数的定义中可以包含变量的声明和赋值,但要注意变量作用域和生命周期。
- 自定义函数可以帮助优化和组织复杂的 SQL 查询,避免重复编写相同的逻辑。
选择
if选择
语法:
if (表达式) then 执行语句;执行语句;执行语句;
elseif (表达式) then 执行语句;执行语句;执行语句;
else 执行语句;
end if;
#例子: 定义一个函数,判断输入的是正数,负数还是零
drop function if exists myfun;
delimiter //
create function myfun (a int)
returns varchar(45)
begin
declare res varchar(45) default '';
if(a>0) then set res = '正数';
elseif(a<0) then set res = '负数';
else set res = '零';
end if;
return res;
end //
delimiter ;
case选择
1.case 变量---语法:
case 变量 when 值1 then 执行语句;
when 值2 then 执行语句;
when 值3 then 执行语句;
end case;
#例子: 定义一个函数,判断输入的是正十,负十还是零
drop function if exists myfun;
delimiter //
create function myfun (a int)
returns varchar(45)
begin
declare res varchar(45) default '';
case a when -10 then set res = '正十';
when 10 then set res = '负十';
when 0 then set res = '零';
end case;
return res;
end//
delimiter;
这里case 一个变量就只能when 具体的值,想要范围可以使用另一种写法。
2.case ---语法:
case when 表达式1 then 执行语句;
when 表达式2 then 执行语句;
when 表达式3 then 执行语句;
when 表达式4 then 执行语句;
end case;
drop function if exists myfun;
delimiter //
create function myfun(a int)
returns varchar(45)
begin
declare res varchar(45) default '';
case when (a>0) then set res = '正数';
when (a<0) then set res = '负数';
when (a=0) then set res = '零';
end case;
return res;
end //
delimiter ;
这样写可以判断范围。
循环
while循环
语法:
while 循环条件
do
执行语句;
end while;
#累加:1+2+....+a
drop function if exists mysum;
delimiter //
create function mysum(a int)
returns int
begin
declare res int default 0;
declare i int default 1;
while(i<=a)
do
set res = res + i;
set i = i + 1;
end while;
return res;
end //
delimiter ;
其他循环
mysql没有for循环,有repeat和loop循环。