1. 程式人生 > >(二十一)函式

(二十一)函式

文章目錄


函式分為兩類:系統函式自定義函式

任何函式都有返回值,因此,可以函式呼叫,都是使用 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 關鍵字宣告,沒有 @ 標識,所有的區域性變數必須在函式體開始之前定義 ;