==1024 程序员 真的很累了 ==
select book_name ,length(book_name) from book_bak;
create function funtion_name(func_parameter)
returns type
[characteritics ...]routine_body
【1】SQL_security:安全 {definer(规定)|invoker(祈求者)}
【2】comment :解释
【3】characteritics :特征
begin
end
-- 先看一个日期格式化的函数
select date_format(return_date,'%Y-%m') from borrowinfo;
-- 创建自定义函数 希望通过指点列名就可以查询到日期信息 YYYY-mm
create function fun(column_name date)
returns varchar(15) -- 指定返回的类型
return date_format(column_name,'%Y-%m'); -- 指定返回的结果
-- 使用自定义的函数查询
select fun(return_date)from borrowinfo;
自定义函数的完整举例
-- 先看一个日期格式化的函数
select date_format(return_date,'%Y-%m') from borrowinfo;
-- 创建自定义函数 希望通过指点列名就可以查询到日期信息 YYYY-mm
delimiter // -- 开始 如果没有,指定返回结果哪里的 ; 会报错 解决这个问题的关键字
create function fun(column_name date)
returns varchar(15) -- 指定返回的类型
begin
return date_format(column_name,'%Y-%m'); -- 指定返回的结果
end // -- 没有
delimiter ; -- 结束
-- 使用自定义的函数查询
select fun(return_date)from borrowinfo;
-- 创建无参数的自定义函数 对日期函数进行封装和简化
create function a()
returns varchar(11)
return date_format(curdate(),'%Y年%m月%d日');
select a();
-- 创建带有参数的自定义函数 传入一个参数
create function b(column_name int )
returns varchar(50) -- 返回值的数据类型
return (select concat_ws('-',book_id,book_name,store) from bookinfo where book_id = column_name);
-- 以图书信息表为例 传入一个图书信息表已有的图书编号
select b(1);
drop function [if exists ] fun_name;
-- 删除自定义函数
DROP FUNCTION if EXISTS a;
-- 删除不存在的函数会报错 FUNCTION rb_sql.a does not exist
DROP FUNCTION a;
-- 删除自定义函数 函数不存在时会警告 (0 row(s) affected, 1 warning(s))
DROP FUNCTION if EXISTS a;
begin ... and
declare : 声明
//定义整形 num 默认值=10
declare num int default 10;
into :(表示方向)进入…中; (表示所属)输入; (表示状态)进入…状态; (表示时间)持续到;
set num =10;
//将图书信息表的value 赋值给num
select value into num from bookinfo;
drop FUNCTION show_name_store;
create FUNCTION show_name_store(val int)
returns varchar(30)
return (select concat_ws('---',book_name,store) from bookinfo where val = book_id);
select show_name_store(1);
== 简化以上方法 实际运用建议采用以下方法==
-- 删除自定义函数
drop FUNCTION show_name_store;
-- 创建自定义函数 定义变量 接收函数的返回值
delimiter //
create FUNCTION show_name_store(val int)
returns varchar(30)
begin
declare result varchar(40); -- 定义变量
select concat_ws('---',book_name,store) into result from bookinfo where val = book_id;
return result;
end //
delimiter;
-- 调用函数 返回结果
select show_name_store(4);
loop: 圈,环; [医]宫内避孕环; 回路; 弯曲部分;
repeat :重说;重申;再做;重复做;在口中留下余味;重复;重
-- 第一题 注意分号 和不要漏写
delimiter //
create FUNCTION show_level(cid char(18))
returns varchar(10)
begin
declare lev varchar(10);
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(card_id) ,balance from readerinfo;
statement : 陈述;声明;报表;报道;账单;结算单;官方声明;
delimiter //
create FUNCTION show_case(cid char(18))
returns varchar(10)
begin
declare a varchar(10);
declare money DECIMAL(7,3);
declare num int;
select balance into money from readerinfo where card_id = cid;
set num = truncate(money/100,0); -- 截断函数 保留整数
case num
when 0 then set a ='非会员,余额不足';
when 1 then set a='非会员,余额不足';
when 2 then set a= '普通会员';
when 3 then set a='等级会员';
when 4 then set a='高级会员';
else set a= '金牌会员';
end case;
return a;
end //
delimiter;
-- 查询
select show_case(card_id),balance from readerinfo;
delimiter //
create FUNCTION show_case2(cid char(18))
returns varchar(10)
begin
declare a varchar(10);
declare money DECIMAL(7,3);
select balance into money from readerinfo where card_id = cid;
case
when money>=500 then set a='金牌会员';
when money>=200 then set a= '普通会员';
when money>=300 then set a='高级会员';
else set money= '非会员,余额不足';
end case;
return a;
end //
delimiter;
-- 查询
select show_case2(card_id),balance from readerinfo;
-- 求N以内的数求和
delimiter //
create function test1(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 ;
select test1(3);
-- 求N以内的数求和
delimiter //
drop function if exists test1//
create function test1(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
label:loop
set num = num + 1;
set sum = sum + num;
if(num>=n) then
leave label; -- 退出loop循环
end if;
end loop label;
return sum;
end//
delimiter ;
select test1(3);
-- 求N以内的数求和
delimiter //
drop function if exists test1//
create function test1(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
repeat
set num = num + 1;
set sum = sum + num;
until num>=n
end repeat;
return sum;
end//
delimiter ;
select test1(3);