MySQL數據庫8(二十四)函數
函數
在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(二十四)函數