轉自:https://www.2cto.com/database/201804/740205.html
MySQL中已經有很多函數,如時間函數等,但是有時這些函數不能滿足自己的設計需求,此時需要自定義函數,用戶自定義函數(User-defined functuin,UDF)是對MySQL的擴展,其用法和內置函數相同
函數需要具備:參數 返回值
對於函數體中的部分可以是:
1、函數體由合法的SQL語句組成
2、函數體可以是簡單的select或者insert語句
3、函數體若為復合結構則使用begin...end語句
4、復合結構可以包含聲明、循環、控制結構
1、無參數
知道通過now()函數可以顯示日期和時間,如果想把這個時間表達成:“年月日時分秒” 的形式怎么辦呢?通過使用格式化函數DATE_FORMAT()
1
|
mysql>
select
DATE_FORMAT(NOW(),
'%Y年%m月%d日 %H點:%i分:%s秒'
);
|
由於該過程書寫較為麻煩,如果經常使用很不方便,因此將其“制作”成函數
1
2
|
mysql>
create
FUNCTION
f1()
returns
varchar
(30)
->
RETURN
DATE_FORMAT(NOW(),
'%Y年:%m月:%d日 %H點:%i分:%s秒'
);
|
由於在定義f1()的時候沒有參數,因此調用時就可以直接調用
1
|
mysql>
select
f1();
|
2、帶有參數
帶有一個以上的參數時,這里求解兩個數的平均數
1
2
3
|
mysql>
create
FUNCTION
f2(num1
smallint
unsigned,num2
smallint
unsigned) #函數名
->
RETURNS
FLOAT
(10,2) UNSIGNED #返回值的類型
->
RETURN
(num1+num2)/2; #返回值
|
3、創建具有復合結構的函數
首先創建一個數據表test
1
2
3
|
root@localhost test>
create
table
test(id tinyint(3) unsigned
primary
key
auto_increment,
-> username
varchar
(30)
not
null
-> );
|
現在想往數據表中插入記錄,返回值是新插入的記錄的id號
1
|
root@localhost test>
insert
into
test
values
(
default
,
'Lj.K'
);
|
由於分號是命令的結束,因此這里需要修改默認的分隔符,否則在輸入分號之后無法返回新插入記錄的id,因此使用命令
1
|
DELIMITER 分隔符
|
這樣所有的命令均需要以分隔符來結束
比這將分隔符修改為//,則所有命令均需要以 // 為結束
1
2
3
4
5
6
7
|
root@localhost test>
create
FUNCTION
adduser(username
varchar
(20)) #創建添加參數名為username的函數adduser
->
RETURNS
INT
UNSIGNED
->
BEGIN
->
INSERT
test(username)
VALUES
(username);
->
RETURN
LAST_INSERT_ID();
->
END
-> //
|
這里因為有兩條語句 insert test(username) values(username)和return last_insert_id()兩條語句要執行,因此需要使用BEGIN...END語句,從而構成聚合體
1
2
|
root@localhost test>
select
adduser(
'Rose'
);
-> //
|
1
2
|
root@localhost test>DELIMITER ;
root@localhost test>
select
adduser(
'Tom'
);
|
通過drop function命令進行刪除