在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 函數名(實參列表);
刪除自函數: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 函數名(實參);