(二十一)函数


函数分为两类:系统函数自定义函数

任何函数都有返回值,因此,可以函数调用,都是使用 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 关键字声明,没有 @ 标识,所有的局部变量必须在函数体开始之前定义 ;

posted @ 2018-11-26 14:47  Yiaz  阅读(115)  评论(0编辑  收藏  举报