mysql常用函数详解
生活随笔
收集整理的這篇文章主要介紹了
mysql常用函数详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. Mysql內置函數分類及使用范圍
- 數學函數: 這類函數只要用于處理數字。這類函數包括絕對值函數、正弦函數、余弦函數、獲取隨機數函數等。
- 字符串函數:這類函數主要用于處理字符串。其中包括字符串連接函數、字符串比較函數、將字符串的字母變成小寫或大寫字母的函數、獲取子串的函數等。
- 日期和時間函數:這類函數主要用于處理日期和時間。其中包括取當前時間的函數、獲取當前日期的函數、返回年份的函數、返回日期的函數等。
- 流程函數:這類函數主要用于在SQL語句中控制條件選擇。其中包括IF語句、CASE語句、WHEN語句等。
- 系統信息函數:這類函數主要用于獲取mysql數據庫的系統信息。其中包括獲取數據庫名的函數、獲取當前用戶的函數、獲取數據庫版本的函數等。
- 加密函數:這類函數主要用于對字符串進行加密解密。其中包括字符串加密函數、字符串解密函數等。
- 其他函數:包括格式化函數、鎖函數等。
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注意連表條件是否會造成死循環。
總結
以上是生活随笔為你收集整理的mysql常用函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文心一言 VS 讯飞星火 VS chat
- 下一篇: Go 接口:Go中最强大的魔法,接口应用