mysql常用函數詳解

2023-11-09 21:00:30

1. Mysql內建函數分類及使用範圍

  1. 數學函數: 這類函數只要用於處理數位。這類函數包括絕對值函數、正弦函數、餘弦函數、獲取亂數函數等。
  2. 字串函數:這類函數主要用於處理字串。其中包括字串連線函數、字串比較函數、將字串的字母變成小寫或大寫字母的函數、獲取子串的函數等。
  3. 日期和時間函數:這類函數主要用於處理日期和時間。其中包括取當前時間的函數、獲取當前日期的函數、返回年份的函數、返回日期的函數等。
  4. 流程函數:這類函數主要用於在SQL語句中控制條件選擇。其中包括IF語句、CASE語句、WHEN語句等。
  5. 系統資訊函數:這類函數主要用於獲取mysql資料庫的系統資訊。其中包括獲取資料庫名的函數、獲取當前使用者的函數、獲取資料庫版本的函數等。
  6. 加密函數:這類函數主要用於對字串進行加密解密。其中包括字串加密函數、字串解密函數等。
  7. 其他函數:包括格式化函數、鎖函數等。

2. 常用函數列舉

1. 數學函數

ABS(x)                      返回x的絕對值

CEIL(x),CEILING(x)          返回大於或等於x的最小整數(向上取整)

FLOOR(x)                    返回小於或等於x的最大整數(向下取整)

RAND()                      返回0~1的亂數

RAND(x)                     返回0~1的亂數,x值相同時返回的亂數相同

SIGN(x)                     返回x的符號,x是負數、0、正數分別返回-1、0、1

PI()                        返回圓周率

TRUNCATE(x,y)               返回數值x保留到小數點後y位的值

ROUND(x)                    返回離x最近的整數(四捨五入)

ROUND(x,y)                  保留x小數點後y位的值,但截斷時要四捨五入

POW(x,y),POWER(x,y)         返回x的y次方

SQRT(x)                     返回x的平方根

EXP(x)                      返回e的x次方

MOD(x,y)                    返回x 除以y以後的餘數

LOG(x)                      返回自然對數(以e為底的對數)

LOG10(x)                    返回以10為底的對數

RADIANS(x)                  講角度轉換為弧度

DEGREES(x)                  講弧度轉換為角度

SIN(x)                      求正弦值

ASIN(x)                     求反正弦值

COS(x)                      求餘弦值

ACOS(x)                     求反餘弦值

TAN(x)                      求正切值

ATAN(x),ATAN(x,y)           求反正切值

COT(x)                      求餘切值

2.字串函數

CHAR_LENGTH(s)              返回字串s的字元數

LENGTH(s)                   返回字串s的長度

CONCAT(s1,s2,.....)         將字串s1,s2等多個字串合併為一個字串

CONCAT_WS(x,s1,s2,....)     同COUCAT(s1,s2,.....),但是每個字串之間要加上x

INSERT(s1,x,len,s2)         將字串s2替換s1的x位置開始長度為len的字串

UPPER(s),UCASE(s)           講字串s的所有字元都變成大寫字母

LOWER(s),LCASE(s)           講字串s的所有字元都變成小寫字母

LEFT(s,n)                   返回字串s的前n個字元

RIGHT(s,n)                  返回字串s的後n個字元

LPAD(s1,len,s2)             字串s2來填充s1的開始處,使字串長度達到len

RPAD(s1,len,s2)             字串s2來填充s1的結尾處,使字串長度達到len

LTRIM(s)                    去掉字串s開始處的空格

RTRIM(s)                    去掉字串s結尾處的空格

TRIM(s)                     去掉字串s開始處和結尾處的空格

TRIM(s1 FROM s)             去掉字串s中開始處和結尾處的字串s1

REPEAT(s,n)                 將字串s重複n次

SPACE(n)                    返回n個空格

REPLACE(s,s1,s2)            用字串s2代替字串s中的字串s1

STRCMP(s1,s2)               比較字串s1和s2

SUBSTRING(s,n,len)          獲取從字串s中的第n個位置開始長度為len的字串

MID(s,n,len)                同SUBSTRING(s,n,len)ATE(s1,s),POSTTION(s1  IN s)從字串s中獲取s1的開始位置

INSTR(s,s1)                 從字串s中獲取s1的開始位置

REVERSE(s)                  將字串s的順序反過來

ELT(n,s1,s2...)             返回第n個字串

FIELD(s,s1,s2...)           返回第一個與字串s匹配的字串的位置

FIND_IN_SET(s1,s2)          返回在字串s2中與s1匹配的字串的位置

MAKE_SET(x,s1,s2...)        按x的二進位制數從s1,s2......sn中選取字串

3.日期和時間函數

CURDATE(),CURRENT_DATE()            返回當前日期

CURTIME(),CURRENT_TIME()            返回當前時間

NOW(),CURRENT_TIMESTAMP()LOCALTIME(),SYSDATE()LOCALTIMESTAMP()     返回當前日期和時間

UNIX_TIMESTAMP()                    以UNIX時間戳的形式返回當前時間

UNIX_TIMESTAMP(d)                   將時間d以UNIX時間戳的形式返回

FROM_UNIXTIME(d)                    把UNIX時間戳的時間轉換為普通格式的時間

UTC_DATE()                          返回UTC(國際協調時間)日期

UTC_TIME()                          返回UTC時間

MONTH(d)                            返回日期d中的月份值,範圍是1~12

MONTHNAME(d)                        返回日期d中的月份名稱,如january

DAYNAME(d)                          返回日期d是星期幾,如Monday

DAYOFWEEK(d)                        返回日期d是星期幾,1表示星期日,2表示星期2

WEEKDAY(d)                          返回日期d是星期幾,0表示星期一,1表示星期2

WEEK(d)                             計算日期d是本年的第幾個星期,範圍是0-53

WEEKOFYEAR(d)                       計算日期d是本年的第幾個星期,範圍是1-53

DAYOFYEAR(d)                        計算日期d是本年的第幾天

DAYOFMONTH(d)                       計算日期d是本月的第幾天

YEAR(d)                             返回日期d中的年份值

QUARTER(d)                          返回日期d是第幾季度,範圍1-4

HOUR(t)                             返回時間t中的小時值

MINUTE(t)                           返回時間t中的分鐘值

SECOND(t)                           返回時間t中的秒鐘值

EXTRACT(type FROM d)                從日期d中獲取指定的值,type指定返回的值,如YEAR,HOUR等

TIME_TO_SEC(t)                      將時間t轉換為秒

SEC_TO_TIME(s)                      將以秒為單位的時間s轉換為時分秒的格式

TO_DAYS(d)                          計算日期d到0000年1月1日的天數

FROM_DAYS(n)                        計算從0000年1月1日開始n天后的日期

DATEDIFF(d1,d2)                     計算日期d1到d2之間相隔的天數

TIMESTAMPDIFF(type,d1,d2)           計算日期d1到d2之間的時間差,type可指定YEAR、MONTH、DAY、HOUR、MINUTE或SECOND。

ADDDATE(d,n)                        計算開始日期d加上n天的日期

ADDDATE(d, INTERVAL  expr type)     計算起始日期d加上一個時間段後的日期

SUBDATE(d,n)                        計算起始日期d減去n天的日期

SUBDATE(d, INTERVAL  expr type)     計算起始日期d減去一個時間段後的日期

ADDTIME(t,n)                        計算起始時間t加上n秒的時間

SUBTIME(t,n)                        計算起始時間t減去n秒的時間

DATE_FORMAT(d,f)                    按照表示式f的要求顯示日期d

TIME_FORMAT(t,f)                    按照表示式f的要求顯示時間t

GET_FORMAT(type,s)                  根據字串s獲取type型別資料的顯示格式

4.條件判斷函數

條件判斷函數用來在SQL語句中進行條件判斷。更加是否滿足判斷條件,SQL語句執行不同的分支。

IF(expr,v1,v2)函數

IF(expr,v1,v2)函數中,如果表示式expr成立,返回結果v1,否則,返回結果v2。

CASE函數

CASE WHEN expr1 THEN v1 [WHEN expr2 THEN v2...][ELSE vn] END
範例 
case status when 1 then '狀態為1' 
when 2 then '狀態為2'
when 3 then '狀態為3'
else '其他' end
等同寫法:
case when status=1 then '狀態為1' 
when status=2 then '狀態為2'
when status=3 then '狀態為3'
else '其他' end

ifnull(val1,val2)                      當val1為null時返回val2,否則返回val1             
nullif(val1,val2)                      當val1等於val2時返回null,否則返回val1

5.系統資訊函數

VERSION()                       返回資料庫的版本號

CONNECTION_ID()                 返回伺服器的連線數,也就是到現在為止mysql服務的連線次數

DATABASE(),SCHEMA()             返回當前資料庫名

USER()                          返回當前使用者的名稱

CHARSET(str)                    返回字串str的字元集

COLLATION(str)                  返回字串str的字元排列方式

LAST_INSERT_ID()                返回最後生成的auto_increment值

6.加密解密函數

PASSWORD(str)                   對字串str進行加密

MD5(str)                        對字串str進行加密

ENCODE(str,pswd_str)            使用字串pswd_str來加密字串str,加密結果是一個二進位制數,必須使用BLOB型別來保持它

DECODE(crypt_str,pswd_str)      解密函數,使用字串pswd_str來為crypt_str解密

7.其他函數

FORMAT(x,n)                     格式化函數,可以講數位x進行格式化,將x保留到小數點後n位,這個過程需要進行四捨五入。

ASCII(s)                        返回字串s的第一個字元的ASSCII碼

BIN(x)                          返回x的二進位制編碼

HEX(x)                          返回x的十六進位制編碼

OCT(x)                          返回x的八進位制編碼

CONV(x,f1,f2)                   將x從f1進位制數變成f2進位制數

INET_ATON(IP)                   將IP地址轉換為數位表示,IP值需要加上引號

INET_NTOA(n)                    可以將數位n轉換成IP的形式

GET_LOCT(name,time)             加鎖函數,定義一個名稱為name、持續時間長度為time秒的鎖,如果鎖定成功,返回1,如果嘗試超時,返回0,如果遇到錯誤,返回NULL.

RELEASE_LOCK(name)              解除名稱為name的鎖,如果解鎖成功,返回1,如果嘗試超時,返回0,如果解鎖失敗,返回NULL。

IS_FREE_LOCK(name)              判斷是否使用名為name的鎖,如果使用,返回0,否則返回1.

CONVERT(s USING cs)             將字串s的字元集變成cs

CAST(x AS type),CONVERT(x,type) 這兩個函數將x變成type型別,這兩個函數只對BINARY,CHAR,DATE,DATETIME,TIME,SIGNED  INTEGER,UNSIGNED INTEGER這些型別起作用,但這兩種方法只是改變了輸出值得資料型別,並沒有改變表中欄位的型別。

3. mysql5.7新增json相關函數

JSON_ARRAY(d1,d2...)                       建立JSON陣列
JSON_ARRAY_APPEND(json_arr, path, value)   往json陣列內之後追加元素
JSON_ARRAY_INSERT(json_arr, path, value)   往json陣列內之前新增元素
JSON_CONTAINS()                            JSON是否在路徑中包含特定物件
JSON_CONTAINS_PATH()                       JSON是否在路徑處包含任何資料
JSON_DEPTH()                               JSON的最大深度
JSON_EXTRACT()                             從JSON獲取資料
JSON_INSERT()                              如果資料不存在就將資料插入JSON
JSON_KEYS()                                JSON檔案中的鍵陣列(類似map.keys())
JSON_LENGTH()                              JSON檔案中的元素數量
JSON_MERGE_PATCH()                         合併JSON,替換重複鍵的值(後面替換前面)
JSON_MERGE_PRESERVE()                      合併JSON,保留重複的鍵
JSON_OBJECT()                              建立JSON
JSON_PRETTY()                              格式化列印JSON
JSON_QUOTE()                               參照JSON(將字元轉換成帶"",能轉換轉譯字元)
JSON_REMOVE()                              從JSON檔案中刪除資料
JSON_REPLACE()                             替換JSON檔案中的值
JSON_SEARCH()                              查詢JSON檔案中值的路徑
JSON_SET()                                 將資料插入JSON檔案(存在即替換值)
JSON_STORAGE_SIZE()                        JSON二進位制所佔位元組數
JSON_TYPE()                                JSON值的型別
JSON_UNQUOTE()                             參照JSON(去除字元的"",能轉換轉譯字元)
JSON_VALID()                               JSON值是否有效

1.建立一個json

select JSON_OBJECT('name','張三','no','001')
#結果:{"no": "001", "name": "張三"}

2.建立一個json陣列

select JSON_ARRAY(JSON_OBJECT('name','張三','no','001')
,JSON_OBJECT('name','李四','no','002'))
#結果:[{"no": "001", "name": "張三"}, {"no": "002", "name": "李四"}]

3.獲取json中的某個值

select JSON_UNQUOTE(JSON_EXTRACT(JSON_ARRAY(JSON_OBJECT('name','張三','no','001')
,JSON_OBJECT('name','李四','no','002')), '$[0].name'))
#結果:張三

4.往json陣列追加元素

select JSON_ARRAY_APPEND(JSON_ARRAY(JSON_OBJECT('name','張三','no','001')
,JSON_OBJECT('name','李四','no','002')),'$',JSON_OBJECT('name','王五','no','003'))
#結果:[{"no": "001", "name": "張三"}, {"no": "002", "name": "李四"}
, {"no": "003", "name": "王五"}] 
#注意,此函數是往元素內增加

select JSON_ARRAY_INSERT(JSON_ARRAY(JSON_OBJECT('name','張三','no','001')
,JSON_OBJECT('name','李四','no','002')),'$[1]',JSON_OBJECT('name','王五','no','003'))
#結果:[{"no": "001", "name": "張三"}, {"no": "003", "name": "王五"},
 {"no": "002", "name": "李四"}]

5.修改json中的某個值

select JSON_REPLACE(JSON_ARRAY(JSON_OBJECT('name','張三','no','001')
,JSON_OBJECT('name','李四','no','002')),'$[1].name','修改後')
#結果:[{"no": "001", "name": "張三"}, {"no": "002", "name": "修改後"}]

6.獲取條件下的指定下標資料
註釋:此方法只能查尋第一條匹配資料
此條件為字串時:

select  order_status_info,
JSON_EXTRACT(order_status_info, '$[*].statusDesc'),
JSON_UNQUOTE(JSON_SEARCH(JSON_EXTRACT(order_status_info, '$[*].statusDesc'),'one','進件完成')) as t,
JSON_EXTRACT(order_status_info,
JSON_UNQUOTE(JSON_SEARCH(JSON_EXTRACT(order_status_info, '$[*].statusDesc'),'one','進件完成')))
from loan_activate_order_extend where id=5678456467878979001

此條件不為字串時

select  order_status_info,
JSON_EXTRACT(order_status_info, '$[*].status'),
REPLACE(REPLACE(REPLACE(JSON_EXTRACT(order_status_info, '$[*].status'),',','","'),'[','["'),']','"]'),
JSON_UNQUOTE(JSON_SEARCH(REPLACE(REPLACE(REPLACE(JSON_EXTRACT(order_status_info, '$[*].status'),',','","'),'[','["'),']','"]'),'one','41')) as t,
JSON_EXTRACT(order_status_info,
JSON_UNQUOTE(JSON_SEARCH(REPLACE(REPLACE(REPLACE(JSON_EXTRACT(order_status_info, '$[*].status'),',','","'),'[','["'),']','"]'),'one','41')))
from loan_activate_order_extend where id=5678456467878979001

4. 參考檔案

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

5. 後言

在使用mysql函數時應當注意查詢效率,sql是否合理,當需求的sql過於複雜的時候應當思考是否可以在表內做欄位沉餘、建中間表等解決方式。
資料格式是否與預期一致,如在使用with recursive注意連表條件是否會造成死迴圈。