(二十一)函式
阿新 • • 發佈:2018-12-12
文章目錄
函式分為兩類:系統函式,自定義函式 ;
任何函式都有返回值,因此,可以函式呼叫,都是使用 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
關鍵字宣告,沒有 @
標識,所有的區域性變數必須在函式體開始之前定義 ;