本章使用的数据库可视化工具为:MySQL Workbench。
下载地址:MySQL Worbench官网下载。下载之后,安装时可能会出现MySQL WOrbench needs Visualstudio C++ 2019...
提示错误,说明没有安装相关Windows插件,在这里下载:The latest supported Visual C++ downloads下载安装,然后就可以正常安装MySQL Workbench了。
-- 创建自定义函数
create function ym_date(mydate date)
returns varchar(15)
return date_format(mydate, '%Y-%m');
使用自定义函数:
-- 使用自定义函数
select ym_date(pubdate) from bookinfo;
结果:
上述的自定义函数没有使用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 ;
-- 创建不带参数的函数
create function newdate()
returns varchar(20)
return date_format(sysdate(), '%Y年%m月%d日');
select newdate();
-- 创建带有参数的函数
create function show_name_store(bid int)
returns varchar(50)
return (select concat_ws('---', book_name, store) from bookinfo where book_id = bid);
-- 删除自定义函数
-- 直接删除,如果函数不存在会报错
drop function newdate;
-- 如果函数存在才删除,不存在不会报错,会出现警告
drop function if exists ym_date;
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);
-- 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;
-- 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;
-- 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;
-- 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);
-- 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);
-- 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);
结果:
特殊说明: 在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语句中末尾是“//”的sql在创建函数时,会执行2条sql: