函数
函数:将一段代码块封装到一个结构中,在需要执行代码块的时候,调用结构执行即可(代码复用)
函数分为两类:系统函数和自定义函数
系统函数
系统定义好的函数,直接调用即可。
任何函数都有返回值,因此函数的调用是通过select调用。
Mysql中,字符串的基本操作单位(最常见的是字符)
Substring:字符串截取(字符为单位)
-- 定义两个变量
set @cn = '世界你好';
set @en = 'hello world';
-- 字符串截取
select substring(@cn,1,1);
select substring(@en,1,1);
char_length:字符长度
Length:字节长度
-- 字符串长度
select char_length(@cn),char_length(@en),length(@cn),length(@en);
Instr:判断字符串是否在某个具体的字符串中存在,存在返回位置
-- 字符串寻找
select instr(@cn,'界'), instr(@en,'ll'),instr(@cn,'拜拜');
Lpad:左填充,将字符串按照某个指定的填充方式,填充到指定长度(字符)
-- 字符串填充
select lpad(@cn,20,'欢迎'),lpad(@en,20,'hello');
Insert:替换,找到目标位置,指定长度的字符串,替换成目标字符串
-- 字符串替换
select insert (@en,3,3,'y'),@en;
Strcmp:compare,字符串比较
-- 字符串比较
set @f = 'hello';
set @s = 'hey';
set @t = 'HEY';
select strcmp(@f,@s),strcmp(@s,@t),strcmp(@s,@f);
自定义函数
函数要素:函数名,参数列表(形参和实参),返回值,函数体(作用域)
创建函数
Create function 函数名([形参列表]) return 数据类型 -- 规定要返回的数据类型
Begin
-- 函数体
-- 返回值:return 类型(指定数据类型);
End
定义函数
-- 创建函数
create function display() returns int
return 100;
自定义函数与系统函数的调用方式一样:select 函数名([实参列表]);
-- 调用函数
select display();
查看函数
查看所有函数:show function status[like 'pattern'];
-- 查看所有函数
show function status\G
查看函数的创建语句:show create function 函数名;
-- 查看函数创建语句
show create function display\G
修改函数&删除函数
函数只能先删除后新增,不能修改。
Drop function 函数名;
-- 删除函数
drop function display;
show function status\G
函数参数
参数分为两种:定义时的参数叫形参,调用时的参数叫实参(实参可以是数值也可以是变量)
形参:要求必须指定数据类型
Function函数名(形参名字 字段类型)returns 数据类型
-- 做函数:计算1-指定数之间的和
delimiter $$
create function display1(int_1 int) returns int
begin
-- 定义条件变量
set @i = 1; -- @定义的变量是全局变量,没有的可以理解为局部变量
set @res = 0; -- 保存结果
-- 循环求和
while @i <= int_1 do
-- 求和:任何变量要修改必须使用set关键字
-- mysql中没有+=,没有++
set @res = @res + @i;
-- 修改循环变量
set @i = @i + 1;
end while;
-- 返回值
return @res;
end
$$ --函数结束
delimiter ;
在函数内部使用@定义的变量在函数外部也可以访问
select display1(10);
select @res,@i;
作用域
Mysql中的作用域与js中的作用域完全一样
全局变量可以在任何地方使用;局部变量只能在函数内部使用。
全局变量:使用set关键字定义,使用@符号标志
局部变量:使用declare关键字声明,没有@符号:所有的局部变量的声明,必须在函数体开始之前
-- 求和:1-指定数之间的和,要求5的倍数不加
delimiter $$
create function display2(int_1 int) returns int
begin
-- 声明变量:循环变量,结果变量
declare i int default 1;
declare res int default 0; -- 定义局部变量可以有属性
-- 循环判断
mywhile :while i<= int_1 do
-- 相加:判断
if i % 5 = 0 then
-- 修改循环条件
set i = i + 1;
-- 不符合条件:循环重新来过
iterate mywhile;
end if;
-- 相加
set res = res + i;
-- 改变循环变量
set i = i+ 1;
end while;
-- 返回结果
return res;
end
$$
delimiter ;
select display2(10);