(二十一)函数
函数分为两类:系统函数,自定义函数 ;
任何函数都有返回值,因此,可以函数调用,都是使用 select
调用;
系统函数
在 mysql
中,字符串的基本操作单位是字符,最常见的是字符 ;
mysql
中,字符起始位从 1
开始计算 ;
函数名 | 作用 |
---|---|
substring(str,start,len) | 字符串截取(字符为单位,因此,汉字截取不会出现问题) |
char_length(str) | 字符长度 ,字符跟字符集没有关系 |
length(str) | 字节长度 |
instr(str,str1) | 寻找字符串,返回找到的字符的下标(从1开始),0 表示找不到 |
lpad(str,len,padstr) | 左填充,将字符串按照某个指定填充方式,填充到指定长度(字符),从左开始填充 ,如果某一次,填充,填超了,则截取填充字符。 |
upad(str,len,padstr) | 右填充,将字符串按照某个指定填充方式,填充到指定长度(字符) ,从右开始填充 |
insert(str,start,len,newStr) | 替换字符串,从指定位置开始,让后续的指定长度的字符,替换成目标字符串 |
strcmp(str,str1) | 字符串比较,小于返回 -1 相等返回 0 ,大于返回 1 ,按照字母顺序比较,Z>A,默认校对集,是无视大小写 |
自定义函数
创建函数的语法
-- 创建一个函数,不带参数的
mysql> create function ft1() returns int
-> begin
-> set @num = 100 ;
-> return @num ;
-> end ;
mysql> -- 创建一个带参数列表的函数,注意顺序, 形参名字 形参类型 ;
-> create function ft2(id int) returns int
-> begin
-> set @a = id + 100 ;
-> return @a ;
-> end ;
Query OK, 0 rows affected
mysql> create function ft3(id int) returns int
-> begin
-> set @i = 0 ;
-> set @res = 0 ;
-> --循环
-> while @i < 10 do
-> -- 循环体
-> -- mysql 中对变量赋值必须使用 set
-> set @res = @res + @i ;
-> -- 改变循环条件
-> set @i = @i + 1 ;
-> --结束循环
-> end while ;
->
-- 改变结束符号
delimiter $
create function ft3(id int) returns int
begin
set @i = 0 ;
set @res = 0 ;
--循环
while @i < 10 do
-- 循环体
-- mysql 中对变量赋值必须使用 set
set @res = @res + @i ;
-- 改变循环条件
set @i = @i + 1 ;
--结束循环
end while ;
-- 返回值
return @res ;
end
$ -- 自定义结束符
delimiter ;
调用函数,无论是自定义函数还是系统函数,都是用 select
;
-- 调用自定义函数
mysql> select ft1() ;
+-------+
| ft1() |
+-------+
| 100 |
+-------+
1 row in set
自定义的函数是属于库级别的,只能在定义的库中使用 ;
查看函数
查看函数的时候,可以查看出所有的自定义函数,包括别的库的自定义函数,但是不能使用 ;
-- 查看函数语法 ;
mysql> show function status ;
+----------+------------+----------+----------------+---------------------+---------------------+---------------+---------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment |
+----------+------------+----------+----------------+---------------------+---------------------+---------------+---------+
| database | ft1 | FUNCTION | root@localhost | 2018-11-26 10:18:18 | 2018-11-26 10:18:18 | DEFINER | |
| database | myFunction | FUNCTION | root@localhost | 2018-11-26 10:15:48 | 2018-11-26 10:15:48 | DEFINER | |
+----------+------------+----------+----------------+---------------------+---------------------+---------------+---------+
2 rows in set
修改&删除函数
函数不可以被修改,只能先删除,再新建 ;
-- 删除函数,写上函数名即可,不需要带上括号 ;
mysql> drop function myFunction ;
Query OK, 0 rows affected
-- 再次查看,发现函数已经被删除
mysql> show function status ;
+----------+------+----------+----------------+---------------------+---------------------+---------------+---------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment |
+----------+------+----------+----------------+---------------------+---------------------+---------------+---------+
| database | ft1 | FUNCTION | root@localhost | 2018-11-26 10:18:18 | 2018-11-26 10:18:18 | DEFINER | |
+----------+------+----------+----------------+---------------------+---------------------+---------------+---------+
1 row in set
变量作用域
全局变量可以在任何地方使用; 局部变量只能在函数内部使用 ;
全部变量:使用 set
关键字定义,使用 @
标识 ;
局部变量:使用 declare
关键字声明,没有 @
标识,所有的局部变量必须在函数体开始之前定义 ;