MySQL數據庫8(二十四)函數

函數

在MySQL中,函數分爲兩類:系統函數(內置函數)和自定義函數html

不論是內置函數仍是用戶自定義函數,都是使用select函數名(參數列表)mysql

內置函數

字符串函數

Mysql8 字符串函數sql

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_instr數據庫

 

char_length():判斷字符串的字符數函數

length():判斷字符串的字節數(與字符集)ui

concat():鏈接字符串加密

instr():判斷字符在目標字符串中是否存在,其開始位置從1開始,存在返回其位置,不存在返回0spa

lcase():所有小寫設計

left():從左側開始截取到指定位置(位置若是超過長度,截取全部)3d

ltrim():消除左邊對應的空格

mid():從中間位置開始截取,若是不指定截取長度,直接到最後

時間函數

Mysql8 時間函數

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

 

now():返回當前時間,日期 時間

curdate():返回當前日期

curtime():返回當前時間

datediff():判斷兩個日期之間的天數差距,參很多天期必須使用字符串格式(引號包裹)

date_add(日期,interval 時間數字 type):進行時間的增長

       type:day/hour/minute/second

unix_timestamp():獲取時間戳

from_unixtime():將制定時間戳轉換成對應的日期時間格式

 

 

數學函數

abs():絕對值

ceiling():向上取整

floor():向下取整

pow():求指數

rand():獲取一個隨機數(0-1)之間

round():四捨五入函數

其餘函數

md5():對數據進行md5加密(mysql中的md5與其餘任何地方的md5加密出來的內容是徹底相同的)

version():獲取版本號

database():顯示當前所在的數據庫

uuid():生成一個惟一標識符(自增加),自增加是單表惟一,UUID是整庫(數據惟一同時空間惟一)

 

 

自定義函數

自定義函數:用戶本身定義的函數

函數:實現某種功能的語句塊(由多條語句組成)

 

一、函數內部的每一條指令都是一個獨立的個體:須要符合語句定義規範,須要語句結束符分號。

二、函數時一個總體,並且函數是在調用的時候纔會被執行,那麼當設計函數的時候,意味着總體不能中斷。

三、mysql一旦見到語句結束符分號,就會自動開始執行

 

解決方案:在定義函數以前,嘗試修改臨時的語句結束符

基本語法:delimiter

修改臨時語句結束符:delimiter 新符號;

中間爲正常SQL指令:使用分號結束(系統不會執行,不認識分號)

使用新符號結束

修改回語句結束符:delimiter ;

 

建立函數

自定義函數包含幾個要素:function關鍵字,函數名,參數(形參和實參[可選]),確認函數返回值類型,函數體,返回值

 

函數定義基本語法:

修改語句結束符

create function 函數名(形參) returns 返回值類型

begin

       //函數體

       return 返回值數據; //數據必須與結構中定義的返回值類型一致

end

語句結束符

修改語句結束符(改回來)

 

報:ERROR 1418(HY000)

 

解決方法:https://www.cnblogs.com/xihong2014/p/5566383.html

 

 

並非全部的函數都須要begin和end:若是函數體自己只有一條指令(return),那麼能夠省略begin和end。

 

形參:在mysql中須要爲函數的形參指定數據類型(形參自己能夠有多個)

基本語法:變量名 字段類型

 

 

查看函數

一、能夠經過查看function狀態,查看全部的函數

show function status [like ‘pattern’];

 

 

二、能夠查看這個 函數的建立語句

show create function 函數名;

 

 

調用函數

自定義函數的調用和內置函數的調用是同樣的:select 函數名(實參列表);

 

 

修改函數

alter function,其餘與建立函數一致

刪除函數

刪除自函數:drop function 函數名;

 

 

注意事項

一、自定義函數是屬於用戶級別的,只有當前客戶端對應的數據庫中可使用

二、能夠在不一樣的數據庫下看到對應的函數,可是不能夠調用

三、自定義函數:一般是爲了將多行代碼集合到一塊兒解決一個重複性問題

四、函數由於必須規範返回值,那麼在函數內部不能使用select指令,select一旦執行就會獲得一個結果(result set):select 字段 into @變量;(惟一可用)

 

 

流程結構案例

 

需求:從1開始,知道用戶傳入的對應的值爲止,自動求和,凡是5的倍數都不要。

 

設計:

一、建立函數

二、須要一個形參,肯定要累加到什麼爲止

三、在函數體內部須要定義一個變量保存對應的結果 set @變量名

使用局部變量來操做:此結果是在函數內部使用

declare 變量名 類型 [=默認值]

四、內部須要一個循環來實現迭代累加

五、循環內部須要進行條件判斷控制:5的倍數

六、函數必須有返回值

 

-- 建立一個自動求和的函數

-- 修改語句結束符
delimiter $$
-- 建立函數
create function my_sum(end_value int) returns int
begin
    -- 聲明變量(局部變量):若是使用declare 聲明變量,必須在函數體其餘語句以前
    declare res int default 0;
    declare i int default 1;
    -- 循環處理
    mywhile:while i <= end_value do
        -- 判斷當前數據是否合理
        if i % 5 = 0 then 
            -- 5的倍數不要
            set i = i + 1;
            iterate mywhile;
        end if;
        -- 修改變量 累加結果
        set res = res + i; -- mysql中沒有++
        set i = i + 1;
    end while mywhile;
    -- 返回值
    return res;
end

-- 結束
$$

-- 修改語句結束符
delimiter ;

調用函數:select 函數名(實參);

相關文章
相關標籤/搜索