首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 函數大全:字符串、日期、數學、加密、聚合等核心函數速查手冊

     編輯:MySQL 綜合教學

MySQL 函數大全:核心函數分類速查手冊

MySQL 提供了豐富的內建函數,涵蓋字符串處理、日期時間運算、數學計算、流程控制、加密壓縮、信息獲取、聚合統計等領域。本文系統整理了常用函數的語法、參數說明及示例,作為開發與調優時的快速參考手冊。

一、 字符串函數

處理文本數據的核心工具,注意 MySQL 字符串位置從 1 開始計算。

函數語法/示例說明
ASCII(str)SELECT ASCII('A'); -- 65返回最左字符 ASCII 碼
ORD(str)SELECT ORD('中');多字節字符編碼計算
CONV(N,from,to)SELECT CONV('FF',16,10); -- 255進制轉換 (2-36 進制)
BIN/OCT/HEX(N)SELECT HEX(255); -- 'FF'二/八/十六進制字符串表示
CHAR(N,...)SELECT CHAR(77,121,83,81,76); -- 'MySQL'整數轉字符拼接
CONCAT(s1,s2...)SELECT CONCAT('My','SQL'); -- 'MySQL'拼接字符串,任一參數為 NULL 則結果為 NULL
CONCAT_WS(sep,...)SELECT CONCAT_WS(',','a','b','c'); -- 'a,b,c'帶分隔符拼接,自動跳過 NULL
LENGTH/CHAR_LENGTHSELECT LENGTH('中文'), CHAR_LENGTH('中文'); -- 6, 2字節長度 vs 字符長度
LOCATE/INSTR/POSITIONSELECT LOCATE('bar','foobarbar'); -- 4子串查找,參數順序略有不同
SUBSTRING/SUBSTR/MIDSELECT SUBSTRING('Quadratically',5,6); -- 'ratica'提取子串,支援負位置從末尾計算
SUBSTRING_INDEXSELECT SUBSTRING_INDEX('www.mysql.com','.',2); -- 'www.mysql'按分隔符第 N 次出現截取
TRIM/LTRIM/RTRIMSELECT TRIM(' bar '); -- 'bar'去除首尾/左/右空格或指定字符
REPLACE(str,from,to)SELECT REPLACE('www.mysql.com','w','Ww');替換所有匹配子串
REVERSE(str)SELECT REVERSE('abc'); -- 'cba'反轉字符串
INSERT(str,pos,len,new)SELECT INSERT('Quadratic',3,4,'What'); -- 'QuWhattic'替換指定位置長度的子串
UPPER/LOWER/UCASE/LCASESELECT UPPER('hello'); -- 'HELLO'大小寫轉換
FIND_IN_SET(str,list)SELECT FIND_IN_SET('b','a,b,c,d'); -- 2在逗號分隔列表中查找位置
FIELD/ELTSELECT FIELD('ej','Hej','ej','Heja'); -- 2返回值在列表中的索引 / 返回索引處的值
SOUNDEXSELECT SOUNDEX('Hello'); -- 'H400'諧音編碼,模糊匹配輔助
SPACE/REPEATSELECT REPEAT('MySQL',3);生成空格/重復字符串
LOAD_FILE/QUOTESELECT QUOTE('Don\'t'); -- 'Don\'t'讀取服務器文件 / SQL 轉義引用

二、 日期時間函數

MySQL 日期函數支援豐富的格式化、運算、提取與轉換。

分類函數示例/說明
當前時間NOW()/SYSDATE()/CURRENT_TIMESTAMP當前日期時間 'YYYY-MM-DD HH:MM:SS'
CURDATE()/CURRENT_DATE當前日期 'YYYY-MM-DD'
CURTIME()/CURRENT_TIME當前時間 'HH:MM:SS'
UTC_DATE/TIME/TIMESTAMPUTC 時間對應值
提取組件
YEAR/MONTH/DAY/HOUR/MINUTE/SECOND提取對應部分
DAYOFWEEK/WEEKDAY星期索引 (1=周日 / 0=周一)
DAYOFMONTH/DAYOFYEAR月內天數 / 年內天數
MONTHNAME/DAYNAME月份/星期英文名
QUARTER/WEEK/WEEKOFYEAR季度/周數 (模式可配置)
格式化與解析
DATE_FORMAT(date,fmt)%Y-%m-%d %H:%i:%s 等豐富佔位符
TIME_FORMAT(time,fmt)僅處理時分秒佔位符
STR_TO_DATE(str,fmt)字符串按格式解析為 DATE/DATETIME
GET_FORMAT(type,locale)獲取標準格式字符串 (EUR/USA/JIS/ISO/INTERNAL)
日期運算
DATE_ADD/DATE_SUBDATE_ADD('2023-01-01', INTERVAL 1 DAY) 支援 YEAR/MONTH/DAY/HOUR/MINUTE/SECOND 等複合間隔
ADDDATE/SUBDATEDATE_ADD/DATE_SUB 別名
ADDTIME/SUBTIME時間加減
DATEDIFF/TIMEDIFF兩日期/時間差 (天數/時間值)
PERIOD_ADD/DIFF年月期間加減月數 YYYYMM 格式
LAST_DAY該月最後一天日期
MAKEDATE/MAKETIME由年/年內天數 或 時分秒構造日期時間
時間戳轉換
UNIX_TIMESTAMP([date])日期轉 Unix 秒數 (從 1970-01-01)
FROM_UNIXTIME(sec[,fmt])Unix 秒數轉日期字符串
TO_DAYS/FROM_DAYS日期轉年份 0 起始天數 / 反向
SEC_TO_TIME/TIME_TO_SEC秒數與 HH:MM:SS 互轉
CONVERT_TZ(dt,from,to)時區轉換
EXTRACT(unit FROM date)提取間隔單元 (同 DATE_ADD 單元)

三、 流程控制函數

函數語法示例
CASECASE val WHEN v1 THEN r1 ... ELSE rn END 或 CASE WHEN cond1 THEN r1 ... ENDSELECT CASE 1 WHEN 1 THEN 'one' ELSE 'other' END;
IF(expr, t, f)expr 為真 (非 0/NULL) 返回 t,否則 fSELECT IF(1>0,'yes','no');
IFNULL(expr1,expr2)expr1 非 NULL 返回 expr1,否則 expr2SELECT IFNULL(NULL,'default');
NULLIF(expr1,expr2)expr1=expr2 返回 NULL,否則 expr1SELECT NULLIF(5,5); -- NULL

四、 數學函數

函數說明示例
ABS/CEIL/FLOOR/ROUND/TRUNCATE絕對值/向上/向下/四捨五入/截斷取整ROUND(1.234,2)=1.23
SIGN符號 -1/0/1
POW/POWER/SQRT冪/平方根POW(2,3)=8
EXP/LN/LOG/LOG2/LOG10指數/自然對數/對數
SIN/COS/TAN/ASIN/ACOS/ATAN/ATAN2三角/反三角函數 (弧度)
DEGREES/RADIANS角度弧度互轉
PI圓周率
MOD(N,M) / N%M取模
RAND([seed])隨機數 0-1,種子固定序列可復現
CRC32循環冗余校驗 32 位無符號

五、 加密與壓縮函數

函數說明
MD5/SHA1/SHA2哈希摘要 (MD5 128bit, SHA1 160bit, SHA2 可選 224/256/384/512)
PASSWORD/OLD_PASSWORDMySQL 用戶密碼加密 (版本相關,慎用)
AES_ENCRYPT/DECRYPTAES 對稱加密 (默認 128bit)
DES_ENCRYPT/DECRYPTTriple-DES 加密
ENCODE/DECODE簡單密碼加密 (非強加密)
ENCRYPT(str[,salt])Unix crypt() 系統調用
COMPRESS/UNCOMPRESSzlib 壓縮/解壓 (需編譯支援)
UNCOMPRESSED_LENGTH壓縮前長度
HEX/UNHEX十六進制編碼/解碼

六、 信息函數

函數用途
VERSION()服務器版本字符串
CONNECTION_ID()當前連接線程 ID
DATABASE()/SCHEMA()當前默認數據庫
USER()/CURRENT_USER/SESSION_USER/SYSTEM_USER當前認證用戶/認證上下文用戶
CHARSET/COLLATION/COERCIBILITY字符集/排序規則/強制性
LAST_INSERT_ID()上條 INSERT 自增 ID
ROW_COUNT()上條語句影響行數
FOUND_ROWS()配合 SQL_CALC_FOUND_ROWS 獲取無 LIMIT 總行數
BENCHMARK(count,expr)性能測試:重復執行表達式

七、 聚合函數

函數說明
COUNT(expr)/COUNT(DISTINCT ...)非 NULL 行數 / 去重計數
SUM/AVG求和/平均 (支援 DISTINCT)
MIN/MAX最小/最大值 (字符串按字典序)
GROUP_CONCAT分組拼接 GROUP_CONCAT(DISTINCT col ORDER BY col SEPARATOR ',')
STD/STDDEV/STDDEV_POP/STDDEV_SAMP總體/樣本標準差
VAR_POP/VAR_SAMP/VARIANCE總體/樣本方差
BIT_AND/BIT_OR/BIT_XOR位運算聚合 (64bit 精度)

八、 其他實用函數

  • DEFAULT(col):獲取列默認值
  • FORMAT(X,D):數字格式化 #,###.##
  • INET_ATON/NTOA:IP 地址與整數互轉
  • GET_LOCK/RELEASE_LOCK/IS_FREE_LOCK/IS_USED_LOCK:用戶級命名鎖
  • UUID():生成全局唯一標識符 (RFC 4122)
  • VALUES(col):INSERT ... ON DUPLICATE KEY UPDATE 中引用插入值
  • SLEEP(duration):休眠秒數 (可微秒)
  • MASTER_POS_WAIT(log,pos[,timeout]):主從同步等待
  • NAME_CONST(name,val):結果集列命名

九、 全文搜索函數

MATCH(col1,col2...) AGAINST(expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])

需在 MyISAM 或 InnoDB (5.6+) 表上建立 FULLTEXT 索引。

十、 使用建議

  1. 字符集統一:庫/表/連接均使用 utf8mb4,避免亂碼與截斷。
  2. 避免隱式轉換:WHERE varchar_col = 123 會導致全表掃描,應寫 '123'。
  3. 日期運算用 INTERVAL:WHERE dt > DATE_SUB(NOW(), INTERVAL 7 DAY) 可用索引,WHERE TO_DAYS(NOW()) - TO_DAYS(dt) < 7 則不可。
  4. 大數據聚合慎用 DISTINCT:考慮臨時表或應用層去重。
  5. 函數下推:MySQL 8.0+ 支援更多函數下推至存儲引擎,升級可獲性能提升。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved