MySQL的自定义函数(第十章)

1 自定义函数的介绍

本章使用的数据库可视化工具为:MySQL Workbench。
下载地址:MySQL Worbench官网下载。下载之后,安装时可能会出现MySQL WOrbench needs Visualstudio C++ 2019...提示错误,说明没有安装相关Windows插件,在这里下载:The latest supported Visual C++ downloads下载安装,然后就可以正常安装MySQL Workbench了。
MySQL的自定义函数(第十章)_第1张图片
MySQL的自定义函数(第十章)_第2张图片
MySQL的自定义函数(第十章)_第3张图片

-- 创建自定义函数
create function ym_date(mydate date)
returns varchar(15)
return date_format(mydate, '%Y-%m');

使用自定义函数:

-- 使用自定义函数
select ym_date(pubdate) from bookinfo;

结果:
MySQL的自定义函数(第十章)_第4张图片
MySQL的自定义函数(第十章)_第5张图片
上述的自定义函数没有使用BEGIN…END语句是因为,整个函数体就一句SQL:return date_format(mydate, ‘%Y-%m’);当然,我们也可以不省略BEGIN…END语句,如下形式:

create function ym_date(mydate date)
returns varchar(15)
begin
return date_format(mydate, '%Y-%m');
end

执行上面的SQL语句会报错,原因是MySQL默认分号表示函数结束了,结果又多出了END,所以就报错了。为了解决冲突问题。我们需要修改MySQL的默认结束符,使用关键字“delimiter”:
delimiter 自定义的结束符,重写自定义函数:

-- 创建自定义函数
-- 自定义结束符
delimiter //
create function ym_date(mydate date)
returns varchar(15)
begin
return date_format(mydate, '%Y-%m');
-- 使用自定义结束符,表示语句结束
end//
-- 改回MySQL默认的结束符
delimiter ;

2 创建和使用自定义函数

MySQL的自定义函数(第十章)_第6张图片
MySQL的自定义函数(第十章)_第7张图片

-- 创建不带参数的函数
create function newdate()
returns varchar(20)
return date_format(sysdate(), '%Y年%m月%d日');

select newdate();

结果:
使用自定函数查看日期
MySQL的自定义函数(第十章)_第8张图片

-- 创建带有参数的函数
create function show_name_store(bid int)
returns varchar(50)
return (select concat_ws('---', book_name, store) from bookinfo where book_id = bid);

结果:
创建带有参数的自定义函数
MySQL的自定义函数(第十章)_第9张图片

-- 删除自定义函数
-- 直接删除,如果函数不存在会报错
drop function newdate;
-- 如果函数存在才删除,不存在不会报错,会出现警告
drop function if exists ym_date;

结果:
删除自定义函数演示结果

3流程控制的使用(上)

MySQL的自定义函数(第十章)_第10张图片
MySQL的自定义函数(第十章)_第11张图片
MySQL的自定义函数(第十章)_第12张图片
MySQL的自定义函数(第十章)_第13张图片

delimiter //
create function show_name_store(bid int)
returns varchar(50)
begin
-- 声明变量
declare result varchar(50);
select concat_ws('---', book_name, store) into result from bookinfo where book_id = bid;
return result;
end //
delimiter ;
-- 调用函数
select show_name_store(20170050);

结果:
在函数中声明变量的查询结果
MySQL的自定义函数(第十章)_第14张图片
MySQL的自定义函数(第十章)_第15张图片
MySQL的自定义函数(第十章)_第16张图片

-- IF语句
delimiter //
create function show_level_byIf(cid char(18))
returns varchar(50)
begin
declare lev varchar(50);
declare money decimal(7,3);
select balance into money from readerinfo where card_id = cid;
if money >= 500 then
	set lev = '金牌会员';
elseif money >= 300 then
	set lev = '高级会员';
elseif money >= 200 then
	set lev = '普通会员';
else
	set lev = '非会员,余额不足!';
end if;
return lev;
end //
delimiter ;
select show_level_byIf(card_id), balance from readerinfo;

结果:
MySQL的自定义函数(第十章)_第17张图片

4流程控制的使用(中)

MySQL的自定义函数(第十章)_第18张图片
使用CASE语句格式1改写上面的IF语句案例:

-- CASE语句格式1
delimiter //
create function show_level_byCase_method01(cardId char(18))
returns varchar(50)
begin
declare lev varchar(50);
declare money decimal(7, 3);
declare num int;
select balance into money from readerinfo where card_id = cardId;
set num = truncate(money/100, 0);
case num
when 0 then set lev = '非会员,余额不足!';
when 1 then set lev = '非会员,余额不足!';
when 2 then set lev = '普通会员';
when 3 then set lev = '高级会员';
when 4 then set lev = '高级会员';
else set lev = '金牌会员';
end case;
return lev;
end //
delimiter ;
select show_level_byCase_method01(card_id), balance from readerinfo;

结果:
MySQL的自定义函数(第十章)_第19张图片
MySQL的自定义函数(第十章)_第20张图片
使用CASE语句格式2改写上面的IF语句案例:

-- CASE语句格式2
delimiter //
create function show_level_byCase_method02(cardId char(18))
returns varchar(50)
begin
declare lev varchar(50);
declare money decimal(7, 3);
select balance into money from readerinfo where card_id = cardId;
case
when money >= 500 then set lev = '金牌会员';
when money >= 300 then set lev = '高级会员';
when money >= 200 then set lev = '普通会员';
else set lev = '非会员,余额不足!';
end case;
return lev;
end //
delimiter ;
select show_level_byCase_method02(card_id), balance from readerinfo;

结果:
MySQL的自定义函数(第十章)_第21张图片

5流程控制的使用(下)

MySQL的自定义函数(第十章)_第22张图片
使用while循环语句求1至n的和:

-- while循环语句求1至n的和
delimiter //
drop function if exists getSumFunction_while;
-- 如果存在就删除,重新创建
create function getSumFunction_while(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
while num < n do
	set num = num + 1;
	set sum = sum + num;
end while;
return sum;
end //
delimiter ;
-- 求1至100的和
select getSumFunction_while(100);

结果:
WHILE循环语句求1至100的和
MySQL的自定义函数(第十章)_第23张图片
使用loop循环语句求1至n的和:

-- loop循环语句求1至n的和
delimiter //
drop function if exists getSumFunction_loop;
create function getSumFunction_loop(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
labelSum: loop
	set num = num + 1;
    set sum = sum + num;
    if num >= n then
		leave labelSum;
	end if;
end loop labelSum;
return sum;
end //
delimiter ;
-- 求1至100的和
select getSumFunction_loop(100);

结果:
loop循环语句求1至100的和
MySQL的自定义函数(第十章)_第24张图片
使用repeat循环语句求1至n的和:

-- repeat循环语句求1至n的和
delimiter //
drop function if exists getSumFunction_repeat//
create function getSumFunction_repeat(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
rep1:repeat
	set num = num + 1;
    set sum = sum + num;
until num >= n
end repeat rep1;
return sum;
end //
delimiter ;
-- 求1至100的和
select getSumFunction_repeat(100);

结果:
repeat循环语句求1至100的和
特殊说明: 在while,loop和repeat中,分别使用以下sql:

-- while循环语句
drop function if exists getSumFunction_while;
-- loop循环语句
drop function if exists getSumFunction_loop;
-- repeat循环语句
drop function if exists getSumFunction_repeat//

仔细观察会发现:这3个sql语句除了删除的函数名称不一样之外,前2句sql的末尾是分号“;”,第3句sql的末尾是“//”。虽然都对,但是还是有区别的。
drop语句中末尾是“;”的sql在创建函数时,由于我们使用关键字delimiter将数据库中默认的结束符“;”修改为“//”,因此遇到“;”会认为没有语句没有结束,这时这个sql在workBench管理工具中执行就只能看到一条sql语句,以loop循环语句为例,创建函数geSumFunction_loop的结果如下所示:
drop语句以分号结尾的创建函数语句执行结果
而drop语句中末尾是“//”的sql在创建函数时,会执行2条sql:

  1. drop语句;
  2. 创建函数的sql语句。
    以repeat循环语句为例,创建函数geSumFunction_repeat的结果如下所示:
    drop语句以

你可能感兴趣的:(MySql入门教程)