MySQL 內建函數超過百種,開發、報表、ETL 時常需現查。本文將官方文檔核心函數分類整理,附帶語法、說明與範例,方便離線速查。
| 函數 | 用途 | 範例/備註 |
|---|---|---|
| ASCII(str) | 回傳最左字元 ASCII 碼 | ASCII('A') → 65 |
| CHAR(N,...) | 整數轉字元串 | CHAR(77,121,83,81,76) → 'MySQL' |
| CONCAT(str1,str2,...) | 串聯字串,任一 NULL 則回 NULL | CONCAT('My','SQL') → 'MySQL' |
| CONCAT_WS(sep,str1,str2,...) | 帶分隔符串聯,忽略 NULL | CONCAT_WS(',','a','b') → 'a,b' |
| LENGTH(str) | 位元組長度 | 多位元組字元計多位元組 |
| CHAR_LENGTH(str) | 字元長度 | 多位元組字元計 1 |
| LOCATE(substr,str[,pos]) | 搜尋子串位置(1-based) | LOCATE('bar','foobarbar') → 4 |
| SUBSTRING(str,pos[,len]) | 擷取子串,支援負位置 | SUBSTRING('Quadratically',5,6) → 'ratica' |
| SUBSTRING_INDEX(str,delim,count) | 依分隔符切割 | SUBSTRING_INDEX('a.b.c','.',2) → 'a.b' |
| TRIM([BOTH|LEADING|TRAILING] [remstr] FROM str) | 去除首尾字元 | TRIM('x' FROM 'xxxbarxxx') → 'bar' |
| REPLACE(str,from,to) | 替換所有匹配 | REPLACE('www.mysql.com','w','Ww') → 'WwWwWw.mysql.com' |
| UPPER/LOWER(str) | 大小寫轉換 | 多位元組安全 |
| LPAD/RPAD(str,len,padstr) | 左右填充 | LPAD('hi',4,'?') → '??hi' |
| REVERSE(str) | 反轉字串 | REVERSE('abc') → 'cba' |
| FIND_IN_SET(str,strlist) | 在逗號列表中尋找位置 | SET 欄位優化用位運算 |
| FIELD(str,str1,str2...) | 回傳 str 在列表中的索引 | FIELD('ej','Hej','ej') → 2 |
| ELT(N,str1,str2...) | 回傳第 N 個字串 | FIELD 反函數 |
| MAKE_SET(bits,str1,str2...) | 位元組合成集合字串 | MAKE_SET(1|4,'a','b','c') → 'a,c' |
| EXPORT_SET(bits,on,off[,sep[,bits]]) | 位元轉 on/off 字串 | EXPORT_SET(5,'Y','N',',',4) → 'Y,N,Y,N' |
| 函數 | 用途 | 範例/備註 |
|---|---|---|
| NOW() / SYSDATE() | 當前日期時間 | NOW=語句開始時間,SYSDATE=即時 |
| CURDATE() / CURTIME() | 當前日期/時間 | 字串/數值語境格式不同 |
| DATE(expr) | 擷取日期部份 | DATE('2023-01-01 12:00') → '2023-01-01' |
| DATE_FORMAT(date,format) | 格式化輸出 | %Y-%m-%d %H:%i:%s 等修飾符 |
| STR_TO_DATE(str,format) | 字串解析為日期 | DATE_FORMAT 逆操作 |
| DATE_ADD(date,INTERVAL expr unit) | 日期加減 | DATE_ADD(NOW(),INTERVAL 1 DAY) |
| DATEDIFF(expr1,expr2) | 兩日期相差天數 | 只比較日期部份 |
| TIMESTAMPDIFF(unit,dt1,dt2) | 兩 datetime 差值 | 單位可為 SECOND/DAY/MONTH 等 |
| UNIX_TIMESTAMP([date]) | 轉 Unix 時間戳 | 秒數,1970-01-01 起 |
| FROM_UNIXTIME(ts[,format]) | 時間戳轉日期 | 可帶格式化 |
| DAYOFWEEK/WEEKDAY(date) | 星期索引 | 1=Sun / 0=Mon |
| MONTHNAME/DAYNAME(date) | 月/星期名稱 | 英文 |
| LAST_DAY(date) | 該月最後一天 | LAST_DAY('2023-02-10') → '2023-02-28' |
| QUARTER(date) | 季度 1-4 | |
| WEEK(date[,mode]) | 周數 | mode 控制起始週與範圍 |
| YEARWEEK(date[,mode]) | 年週組合 | |
| PERIOD_ADD(P,N) / PERIOD_DIFF(P1,P2) | 年月期運算 | 格式 YYYYMM |
| SEC_TO_TIME / TIME_TO_SEC | 秒↔時間互轉 |
| 函數 | 用途 | 範例 |
|---|---|---|
| ABS(X) | 絕對值 | ABS(-2) → 2 |
| CEILING/FLOOR(X) | 向上/向下取整 | CEILING(2.3)→3, FLOOR(-2.3)→-3 |
| ROUND(X[,D]) | 四捨五入 | ROUND(2.432,2)→2.43, ROUND(12.432,-1)→10 |
| TRUNCATE(X,D) | 截斷不捨入 | TRUNCATE(2.432,2)→2.43 |
| MOD(N,M) / N % M | 取餘 | MOD(3,2)→1 |
| POW(X,Y) / POWER(X,Y) | 乘冪 | POW(2,3)→8 |
| SQRT(X) | 平方根 | SQRT(4)→2 |
| RAND([N]) | 隨機數 0-1 | 給種子可重現序列 |
| SIGN(X) | 符號 -1/0/1 | |
| TRIG 函數:SIN/COS/TAN/ASIN/ACOS/ATAN/ATAN2 | 三角函數 | 弧度制 |
| DEGREES/RADIANS(X) | 角度↔弧度 | |
| LOG/LOG2/LOG10/LN/EXP | 對數/指數 | |
| PI() | 圓周率 | 雙精度 |
| CRC32(expr) | 循環冗餘校驗 | 回傳 32-bit 無號整數 |
CASE WHEN cond THEN val ... ELSE def END
IF(cond, true_val, false_val)
IFNULL(expr1, expr2) -- expr1 不為 NULL 回 expr1,否則 expr2
NULLIF(expr1, expr2) -- 相等回 NULL,否則 expr1
| 函數 | 用途 | 備註 |
|---|---|---|
| MD5(str) | 128-bit 雜湊,32 位十六進制 | 常用做摘要 |
| SHA1/SHA2(str,256|512) | SHA 雜湊 | SHA2 更安全 |
| PASSWORD(str) | MySQL 密碼雜湊 | 內部認證用,不建議業務用 |
| AES_ENCRYPT/DECRYPT(str,key) | AES 加解密 | 金鑰長度 128/256-bit |
| DES_ENCRYPT/DECRYPT | Triple-DES | 需 SSL 支援 |
| ENCODE/DECODE(str,pass) | 簡易加解密 | 安全性低 |
| ENCRYPT(str[,salt]) | Unix crypt() | salt 至少 2 字元 |
| OLD_PASSWORD(str) | 4.1 前密碼雜湊 | 相容舊客戶端 |
| 函數 | 用途 |
|---|---|
| VERSION() | Server 版本字串 |
| CONNECTION_ID() | 當前連線 Thread ID |
| CURRENT_USER() | 認證用戶@主機 |
| USER() / SESSION_USER() / SYSTEM_USER() | 客戶端用戶@主機 |
| DATABASE() / SCHEMA() | 當前預設資料庫 |
| FOUND_ROWS() | 配合 SQL_CALC_FOUND_ROWS 取總行數 |
| LAST_INSERT_ID([expr]) | 最後 AUTO_INCREMENT 值 |
| ROW_COUNT() | 前一條 DML 影響行數 |
| BENCHMARK(count,expr) | 效能測試,重複執行 expr |
| CHARSET/CHARSET(str) | 字串字符集 |
| COLLATION(str) | 字串排序規則 |
| 函數 | 用途 | 備註 |
|---|---|---|
| AVG/COUNT/SUM/MIN/MAX | 基礎聚合 | 支援 DISTINCT |
| GROUP_CONCAT(expr [ORDER BY] [SEPARATOR]) | 分組串聯 | 預設 1024 字元,可調 group_concat_max_len |
| BIT_AND/OR/XOR(expr) | 位元聚合 | 64-bit 精度 |
| STD/STDDEV/STDDEV_POP/SAMP | 標準差 | |
| VAR_POP/VAR_SAMP/VARIANCE | 變異數 |
UUID():生成 RFC 4122 UUIDINET_ATON/NTOA(ip):IPv4 字串↔整數GET_LOCK/RELEASE_LOCK/IS_FREE_LOCK/IS_USED_LOCK(str,timeout):應用層命名鎖SLEEP(sec):休眠秒數,可含微秒VALUES(col):INSERT ... ON DUPLICATE KEY UPDATE 中引用插入值DEFAULT(col):取欄位預設值FORMAT(X,D):數字格式化 #,###.##COMPRESS/UNCOMPRESS/UNCOMPRESSED_LENGTH:zlib 壓縮(需編譯支援)CHAR_LENGTH、SUBSTRING 等。NOW() 受 time_zone 影響,UTC_TIMESTAMP() 固定 UTC。CAST(... AS CHAR) 避免驚喜。GROUP_CONCAT、FIND_IN_SET 大資料量時慎用;RAND() 在 ORDER BY 會全表掃描。MySQL 函數庫極豐富,熟悉分類與常用組合(如 DATE_FORMAT+STR_TO_DATE、CONCAT_WS+GROUP_CONCAT、AES_ENCRYPT+UNHEX)能大幅提升 SQL 表達力與效能。建議收藏本速查表,實戰中隨查隨用。