回顧和概述
內(nèi)置函數(shù)庫:
- 字符函數(shù)
- 數(shù)值函數(shù)
- 日期時(shí)間函數(shù)
- 加密函數(shù)
如果需要一些系統(tǒng)沒有提供的函數(shù)钞脂,就需要自定義函數(shù)了
自定義函數(shù)簡(jiǎn)介
自定義函數(shù):用戶自定義函數(shù)(user-defined function,UDF)是一種對(duì)MySQL擴(kuò)展的途徑,其用法與內(nèi)置函數(shù)相同捕儒。
自定義函數(shù)的兩個(gè)必要條件:
1.參數(shù)(可以為空)
2.返回值
函數(shù)可以返回任意類型的值冰啃,同樣可以接收這些類型的參數(shù)
函數(shù)參數(shù)和返回值沒有必然的練習(xí)
在MySQL中邓夕,函數(shù)參數(shù)的數(shù)量理論上不能超過1024個(gè),這個(gè)數(shù)量對(duì)于大部分開發(fā)都足夠了
創(chuàng)建自定義函數(shù)
CREATE FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL | DECIMAL}
routine_body
關(guān)于函數(shù)體
1.函數(shù)體由合法的SQL語句構(gòu)成
2.函數(shù)體可以是簡(jiǎn)單的SELECT或INSERT語句
3.函數(shù)體如果為復(fù)合結(jié)構(gòu)則使用BEGIN...END語句
4.復(fù)合結(jié)構(gòu)可以包含聲明阎毅,循環(huán)焚刚,控制結(jié)構(gòu)
創(chuàng)建不帶參數(shù)的自定義函數(shù)
創(chuàng)建一個(gè)函數(shù),使之返回的日期格式為:Y年m月d日 H點(diǎn):i分:s秒
使用sql語句可以這樣實(shí)現(xiàn):
首先設(shè)置客戶端編碼方式(只是設(shè)置客戶端顯示的編碼方式扇调,不會(huì)影響服務(wù)端):
SET NAME gbk;
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H時(shí):%i分:%s秒');#把當(dāng)前日期格式化成“Y年m月d日 H點(diǎn):i分:s秒”的形式
但是如果我們以后要使用這個(gè)函數(shù)矿咕,就要每次這樣寫,如果把它封裝成一個(gè)函數(shù)狼钮,以后使用就會(huì)很方便
CREATE FUNCTION f1() RETURNS VACHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H時(shí):%i分:%s秒');
調(diào)用:
SELECT f1();#結(jié)果為格式化后的當(dāng)前日期
創(chuàng)建帶有參數(shù)的自定義函數(shù)
寫一個(gè)計(jì)算兩個(gè)數(shù)的平均值的函數(shù)
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALL UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2碳柱;
調(diào)用:
SELECT f2(10,15);結(jié)果為12.5。如果沒有提供參數(shù)會(huì)報(bào)錯(cuò)
如果系統(tǒng)本來已經(jīng)存在了一個(gè)函數(shù)名為f2的函數(shù)熬芜,那么在再次創(chuàng)建名為f2的函數(shù)時(shí)就會(huì)報(bào)錯(cuò)莲镣,可以使用DROP FUNCTION f2;
刪除函數(shù)
創(chuàng)建具有復(fù)合結(jié)構(gòu)函數(shù)體的自定義函數(shù)
數(shù)據(jù)庫中有一張表,結(jié)構(gòu)如下
數(shù)據(jù)庫中有兩條記錄:
創(chuàng)建一個(gè)函數(shù)涎拉,可以向表中插入一條記錄并返回新插入的id
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
RETURN
INSERT test (username) VALUES(username);#會(huì)報(bào)錯(cuò)剥悟,因?yàn)橄到y(tǒng)會(huì)認(rèn)為”;“為MySQL的語句結(jié)束,而不是一條函數(shù)語句的結(jié)束
修改MySQL的語句結(jié)束符號(hào)為”//“曼库,DELIMITER //
也有些人習(xí)慣修改成$
修改后MySQL只有在遇到"http://"后才會(huì)執(zhí)行
如:
SELECT VERSION();#回車后還讓繼續(xù)輸入
//#再輸入"http://"后才會(huì)執(zhí)行
再次創(chuàng)建
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
RETURN
INSERT test (username) VALUES(username);
LAST_INSERT_ID();
//
依然提示錯(cuò)誤区岗,因?yàn)橛袃蓷l語句需要執(zhí)行,這是就需要加上BEGIN...END構(gòu)成聚合體
再次創(chuàng)建
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT test (username) VALUES(username);
RETURN LAST_INSERT_ID();
END
//
創(chuàng)建成功
調(diào)用:
把分隔符修改回去:DELIMITER ;
SELECT adduser('Rose');#返回值是3
SELECT adduser('Tom');#返回值是4
使用SELECT * FROM test;
查看表結(jié)構(gòu)可以看到已經(jīng)插入成功
實(shí)際開發(fā)中自定義函數(shù)用的不多毁枯,知道如何創(chuàng)建就行了
刪除函數(shù):
DROP FUNCTION [IF EXISTS] function_name