1. 程式人生 > >MySQL數據庫8(二十四)函數

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

base 包含 參數 自定義 reat 方法 database val 解決方法

函數

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

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

內置函數

字符串函數

Mysql8 字符串函數

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

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

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

concat():連接字符串

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

lcase():全部小寫

left():從左側開始截取到指定位置(位置如果超過長度,截取所有)

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是整庫(數據唯一同時空間唯一)

技術分享圖片

自定義函數

自定義函數:用戶自己定義的函數

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

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

2、函數時一個整體,而且函數是在調用的時候才會被執行,那麽當設計函數的時候,意味著整體不能中斷。

3、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中需要為函數的形參指定數據類型(形參本身可以有多個)

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

技術分享圖片

查看函數

1、可以通過查看function狀態,查看所有的函數

show function status [like ‘pattern’];

技術分享圖片

2、可以查看這個 函數的創建語句

show create function 函數名;

技術分享圖片

調用函數

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

技術分享圖片

刪除函數

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

技術分享圖片

註意事項

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

2、可以在不同的數據庫下看到對應的函數,但是不可以調用

3、自定義函數:通常是為了將多行代碼集合到一起解決一個重復性問題

4、函數因為必須規範返回值,那麽在函數內部不能使用select指令,select一旦執行就會得到一個結果(result set):select 字段 into @變量;(唯一可用)

流程結構案例

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

設計:

1、創建函數

2、需要一個形參,確定要累加到什麽為止

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

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

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

4、內部需要一個循環來實現叠代累加

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

6、函數必須有返回值

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

-- 修改語句結束符
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 函數名(實參);

技術分享圖片

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