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

MySQL 內置函數大全速查手冊:字符串、日期、數學、加密、聚合、信息函數分類詳解

     編輯:MySQL 綜合教學

前言:不背誦,會查閱,知邊界

MySQL 提供 200+ 內置函數,涵蓋字符串處理、日期時間運算、數學計算、加密安全、聚合統計、元信息查詢等領域。本文按**功能分類**整理核心函數簽名、參數說明、典型示例與避坑提示,作為開發調試時的「隨身速查表」。

一、字符串函數(高頻 TOP 20)

函數作用關鍵行為/陷阱示例
CONCAT(s1,s2...)拼接字符串**任一參數為 NULL 結果為 NULL**CONCAT('My','SQL') → 'MySQL'
CONCAT_WS(sep,s1,s2...)帶分隔符拼接**自動跳過 NULL**,不產生多餘分隔符CONCAT_WS(',', 'a', NULL, 'c') → 'a,c'
LENGTH(str)字節長度多字節字符按字節計LENGTH('中') → 3 (utf8mb4)
CHAR_LENGTH(str)字符長度多字節字符計 1CHAR_LENGTH('中') → 1
SUBSTRING(str,pos,len)截取子串pos 從 1 起;支援負數倒數SUBSTRING('abcde', 2, 3) → 'bcd'
SUBSTRING_INDEX(str,delim,count)按分隔符截取count>0 取左,<0 取右SUBSTRING_INDEX('a.b.c', '.', 2) → 'a.b'
TRIM([BOTH|LEADING|TRAILING] [rem] FROM str)去除首尾字符默認去空格,rem 可指定字符集TRIM(' x ' ) → 'x'
REPLACE(str,from,to)替換所有匹配區分大小寫REPLACE('abc', 'b', 'X') → 'aXc'
LOCATE(sub,str[,pos])查找子串位置不存在返回 0;pos 指定起始位置LOCATE('bar', 'foobarbar') → 4
LOWER/UPPER(str)大小寫轉換受字符集影響UPPER('mysql') → 'MYSQL'
LPAD/RPAD(str,len,pad)左/右填充超長截斷LPAD('1', 5, '0') → '00001'
REVERSE(str)反轉字符串REVERSE('abc') → 'cba'
INSERT(str,pos,len,newstr)替換指定區間pos 從 1 起INSERT('Quadratic', 3, 4, 'What') → 'QuWhattic'
FIELD(str,s1,s2...)返回 str 在列表中索引找不到返回 0FIELD('b', 'a','b','c') → 2
FIND_IN_SET(str,strlist)集合中查找strlist 為逗號分隔字符串FIND_IN_SET('b','a,b,c') → 2
HEX/UNHEX十六進制互轉UNHEX 為 HEX 逆操作HEX('MySQL') → '4D7953514C'
SOUNDEX(str)聲音編碼英文近似發音匹配SOUNDEX('Hello') → 'H400'
SPACE(N)生成 N 空格SPACE(4) → ' '
ELT(N, s1, s2...)返回第 N 個參數N 超出返回 NULLELT(2, 'a','b') → 'b'
MAKE_SET(bits, s1, s2...)按位組合字符串bits 二進制位對應參數MAKE_SET(5,'a','b','c') → 'a,c'

二、日期時間函數(核心 15+)

函數作用示例/備註
NOW() / SYSDATE()當前日期時間NOW() 取語句開始時間,SYSDATE() 取實時時間
CURDATE() / CURTIME()當前日期/時間
DATE(expr)提取日期部分DATE('2023-01-01 12:00') → '2023-01-01'
DATE_FORMAT(date, fmt)格式化日期%Y年 %m月 %d日 %H時 %i分 %s秒
STR_TO_DATE(str, fmt)字符串解析為日期DATE_FORMAT 逆操作
DATE_ADD/DATE_SUB(date, INTERVAL expr unit)日期加減unit: SECOND/MINUTE/HOUR/DAY/MONTH/YEAR 等
DATEDIFF(d1, d2)兩日期相差天數DATEDIFF('2023-01-03','2023-01-01') → 2
TIMESTAMPDIFF(unit, dt1, dt2)精確時間差unit 可為 MICROSECOND/SECOND/MINUTE 等
UNIX_TIMESTAMP([date])轉 Unix 時間戳無參數取當前
FROM_UNIXTIME(ts[, fmt])時間戳轉日期
DAYOFWEEK/WEEKDAY(date)星期索引前者 1=周日,後者 0=周一
LAST_DAY(date)月最後一天
QUARTER(date)季度 1-4
PERIOD_ADD/PERIOD_DIFF年月運算格式 YYYYMM
SEC_TO_TIME / TIME_TO_SEC秒與時間互轉
EXTRACT(unit FROM date)提取日期部件同 DATE_ADD 的 unit

三、數學函數(常用 15)

ABS(x)          -- 絕對值
CEIL(x)/FLOOR(x)  -- 向上/向下取整
ROUND(x[,d])     -- 四捨五入保留 d 位
TRUNCATE(x,d)    -- 截斷保留 d 位(不四捨五入)
MOD(n,m) / n%m   -- 取模
POW(x,y)         -- x 的 y 次方
SQRT(x)          -- 平方根
RAND([seed])     -- 隨機數 0-1,種子固定序列固定
SIN/COS/TAN(x)   -- 三角函數(弧度)
ASIN/ACOS/ATAN   -- 反三角
ATAN2(y,x)       -- 兩參數反正切,定象限
DEGREES/RADIANS  -- 角度弧度互轉
LN(x)/LOG(x)/LOG2/LOG10  -- 對數
EXP(x)           -- e^x
PI()             -- π
CRC32(expr)      -- 循環冗餘校驗

四、控制流函數

CASE WHEN cond1 THEN v1 [WHEN cond2 THEN v2...] [ELSE vd] END
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2...] [ELSE rd] END
IF(cond, true_val, false_val)
IFNULL(v1, v2)           -- v1 不為 NULL 返回 v1,否則 v2
NULLIF(v1, v2)           -- 相等返回 NULL,否則 v1

五、加密與壓縮函數

函數用途備註
MD5(str)128 位摘要返回 32 位十六進制字符串,不可逆
SHA1/SHA2(str, 256|512)SHA 摘要更安全
PASSWORD(str)MySQL 密碼加密內部用,版本間算法不同,**業務勿用**
AES_ENCRYPT/DECRYPT(str, key)AES 對稱加密密鑰長度 128/256 位
DES_ENCRYPT/DECRYPTDES 加密需 SSL 支援
ENCODE/DECODE(str, pass)簡易加密安全性低,**不推薦生產**
COMPRESS/UNCOMPRESS(str)zlib 壓縮/解壓需編譯支援 zlib
UNCOMPRESSED_LENGTH(str)壓縮前長度

六、聚合函數

COUNT(expr) / COUNT(DISTINCT expr)
SUM/AVG/MIN/MAX([DISTINCT] expr)
GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR ','])
STDDEV_POP/SAMP(expr)   -- 總體/樣本標準差
VAR_POP/SAMP(expr)      -- 總體/樣本方差
BIT_AND/OR/XOR(expr)    -- 位運算聚合

七、信息函數(運維診斷常用)

VERSION()                    -- 服務器版本
CONNECTION_ID()              -- 當前連接 ID (線程 ID)
CURRENT_USER()               -- 驗證用戶@主機
USER() / SYSTEM_USER()       -- 客戶端發起用戶@主機
DATABASE() / SCHEMA()        -- 當前默認數據庫
FOUND_ROWS()                 -- 配合 SQL_CALC_FOUND_ROWS 獲取無 LIMIT 總行數
ROW_COUNT()                  -- 影響行數 (INSERT/UPDATE/DELETE)
LAST_INSERT_ID()             -- 上條語句生成的 AUTO_INCREMENT 值
BENCHMARK(count, expr)       -- 表達式執行 count 次耗時(性能測試)
CHARSET/CHARSET(str)         -- 字符集/排序規則
INET_ATON/NTOA(ip)           -- IP 地址與整數互轉
GET_LOCK/RELEASE_LOCK/IS_FREE_LOCK/IS_USED_LOCK  -- 具名鎖服務
UUID()                       -- 生成 UUID (RFC 4122)
SLEEP(sec)                   -- 休眠秒數,可用於測試超時

八、其他實用函數

DEFAULT(col)          -- 列默認值(僅 INSERT...ON DUPLICATE KEY UPDATE 中有效)
VALUES(col)           -- 同 INSERT...ON DUPLICATE KEY UPDATE 中引用待插值
FORMAT(x, d)          -- 數字格式化 '###,###.##' 保留 d 位
MASTER_POS_WAIT(log, pos[, timeout]) -- 主從同步等待工具

避坑提示速查

  • CONCAT 遇 NULL 全 NULL → 用 CONCAT_WS 或 COALESCE。
  • 日期字符串隱式轉換依賴 sql_mode → 顯式用 STR_TO_DATE。
  • ROUND 四捨五入受「銀行家算法」影響(.5 向最近偶數) → 精確金額用 DECIMAL + 應用層處理。
  • PASSWORD() 非業務函數 → 用 SHA2 或 BCRYPT(應用層)。
  • GROUP_CONCAT 默認 1024 字節截斷 → SET SESSION group_concat_max_len = 100000;。

結語

函數是 SQL 表達力的延伸。**熟悉分類、掌握核心 20%、知道去哪查文檔**,比死記硬背更高效。建議將本文收藏,遇到「這功能 MySQL 有現成函數嗎?」時,Ctrl+F 一搜即得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved