MySQL 提供豐富的內建函數,遠超 SQL Server。本文按功能分類整理核心函數語法、參數、回傳值與實戰範例,重點標註與 SQL Server 的差異,作為開發速查手冊。
| 函數 | 說明 | 範例 |
|---|---|---|
ABS(x) | 絕對值 | ABS(-5)=5 |
MOD(x,y) | 取模(支援小數) | MOD(31,8)=7、MOD(1.5,0.7)=0.1 |
TRUNCATE(x,d) | 截斷到 d 位小數(不四捨五入) | TRUNCATE(1.32,1)=1.3 |
ROUND(x,d) | 四捨五入 | ROUND(1.35,1)=1.4 |
CEIL(x)/FLOOR(x) | 向上/向下取整 | CEIL(1.1)=2 |
POW(x,y)/POWER(x,y) | x 的 y 次方 | POW(2,3)=8 |
SQRT(x) | 平方根 | SQRT(4)=2 |
RAND([seed]) | 0~1 隨機數,種子固定序列可重現 | RAND(10) |
SIGN(x) | 正負號 -1/0/1 | SIGN(-5)=-1 |
CONV(n, from, to) | 進制轉換 | CONV('a',16,2)='1010' |
| 函數 | 說明 | 範例 |
|---|---|---|
CHAR_LENGTH(str) | 字元數(多位元組算 1) | CHAR_LENGTH('中文')=2 |
LENGTH(str) | 位元組數 | LENGTH('中文')=6 (utf8mb4) |
CONCAT(s1,s2,...) | 連接,任一 NULL 結果 NULL | CONCAT('a','b')='ab' |
CONCAT_WS(sep, s1,s2,...) | 帶分隔符連接,自動跳過 NULL | CONCAT_WS('-','a',NULL,'c')='a-c' |
INSERT(str,pos,len,newstr) | 替換子串(對應 STUFF) | INSERT('abcdef',2,2,'XY')='aXYdef' |
LPAD(str,len,pad)/RPAD | 左右填充至指定長度 | LPAD('5',3,'0')='005' |
TRIM([BOTH|LEADING|TRAILING] rem FROM str) | 去除兩側指定字串(預設空格) | TRIM('x' FROM 'xxabcxx')='abc' |
REPLACE(str,from,to) | 全部替換 | REPLACE('a b',' ','-')='a-b' |
SUBSTRING(str,pos,len) | 子串(支援負位置從右算) | SUBSTRING('abcdef',2,3)='bcd' |
LOCATE(sub,str)/POSITION/INSTR | 子串首次出現位置 | LOCATE('b','abc')=2 |
STRCMP(s1,s2) | 比較回傳 -1/0/1 | STRCMP('a','b')=-1 |
FIELD(str, s1,s2...) | str 在列表中位置(1-based) | FIELD('b','a','b','c')=2 |
FIND_IN_SET(str, list) | 逗號分隔列表中位置 | FIND_IN_SET('b','a,b,c')=2 |
ELT(n, s1,s2...) | 返回第 n 個字串 | ELT(2,'a','b')='b' |
MAKE_SET(bits, s1,s2...) | bits 二進制位對應字串集合 | MAKE_SET(5,'a','b','c')='a,c' (5=101b) |
REPEAT(str, n) | 重複 n 次 | REPEAT('ab',3)='ababab' |
REVERSE(str) | 反轉字串 | REVERSE('abc')='cba' |
HEX(str)/UNHEX(hex) | 字串↔十六進制 | HEX('abc')='616263' |
| 函數 | 說明 | 範例 |
|---|---|---|
NOW()/SYSDATE() | 當前日期時間 | 2024-01-15 10:30:00 |
CURDATE()/CURTIME() | 當前日期/時間 | |
UTC_DATE()/UTC_TIME()/UTC_TIMESTAMP() | UTC 日期/時間/時間戳 | |
DATE_ADD(d, INTERVAL expr unit) | 日期加減 | DATE_ADD(NOW(), INTERVAL 1 DAY) |
DATEDIFF(d1,d2) | 兩日期天數差 | DATEDIFF('2024-01-15','2024-01-10')=5 |
DATE_FORMAT(d, fmt) | 日期格式化 | DATE_FORMAT(NOW(),'%Y-%m-%d') |
STR_TO_DATE(str, fmt) | 字串解析為日期 | STR_TO_DATE('20240115','%Y%m%d') |
EXTRACT(unit FROM d) | 提取日期部分(對應 DATEPART) | EXTRACT(MONTH FROM NOW()) |
TIME_TO_SEC(t)/SEC_TO_TIME(s) | 時間↔秒互轉 | TIME_TO_SEC('01:00:00')=3600 |
UNIX_TIMESTAMP([d]) | 日期轉 Unix 時間戳 | UNIX_TIMESTAMP() |
FROM_UNIXTIME(ts) | 時間戳轉日期 | FROM_UNIXTIME(1705286400) |
MONTHNAME(d) | 月份英文全名 | MONTHNAME('2024-01-15')='January' |
QUARTER(d) | 季度 1~4 | QUARTER('2024-04-01')=2 |
WEEK(d,mode)/WEEKOFYEAR(d) | 週數 | |
LAST_DAY(d) | 該月最後一天 | LAST_DAY('2024-02-10')='2024-02-29' |
| 函數 | 說明 | 範例 |
|---|---|---|
IF(expr, v1, v2) | expr 真回傳 v1 否則 v2 | IF(1>2,'yes','no')='no' |
IFNULL(v1, v2) | v1 非 NULL 回傳 v1 否則 v2 | IFNULL(NULL, 'def')='def' |
CASE WHEN cond THEN val ... ELSE val END | 多條件分支 | CASE WHEN score>=90 THEN 'A' ELSE 'B' END |
NULLIF(v1,v2) | v1=v2 回傳 NULL 否則 v1 (SQL Server 有) | NULLIF(1,1)=NULL |
| 函數 | 說明 |
|---|---|
VERSION() | MySQL 版本字串 |
CONNECTION_ID() | 當前連線 ID |
DATABASE()/SCHEMA() | 當前資料庫名 |
USER()/CURRENT_USER() | 當前認證用戶@主機 |
CHARSET(str) | 字串字元集 |
COLLATION(str) | 字串排序規則 |
LAST_INSERT_ID() | 最後自增 ID(會話級,批次 INSERT 只回傳第一筆) |
ROW_COUNT() | 前一條 DML 影響行數 |
FOUND_ROWS() | 配合 SQL_CALC_FOUND_ROWS 取總行數 |
BENCHMARK(count, expr) | 效能基準測試 |
SHOW PROCESSLIST/SHOW FULL PROCESSLIST | 當前執行緒狀態(含 Info SQL 文本) |
| 函數 | 說明 | 備註 |
|---|---|---|
PASSWORD(str) | MySQL 內部認證加密(5.7+ 已棄用,8.0 移除) | 不可逆,勿用於應用層 |
MD5(str) | MD5 雜湊(32 位十六進制) | 不可逆 |
SHA1(str)/SHA2(str, 256|512) | SHA 雜湊 | 不可逆 |
AES_ENCRYPT(str, key)/AES_DECRYPT | 對稱加密(128/256 bit) | 可逆,金鑰管理需謹慎 |
ENCODE(str, pwd)/DECODE(crypt, pwd) | 簡易加解密(已棄用) | 不建議生產使用 |
| 函數 | 說明 | 範例 |
|---|---|---|
FORMAT(x, d) | 數字格式化含千分位 | FORMAT(12345.67,2)='12,345.67' |
INET_ATON(ip) | IPv4 字串轉無符號整數 | INET_ATON('192.168.1.1')=3232235777 |
INET_NTOA(num) | 整數轉 IPv4 字串 | INET_NTOA(3232235777)='192.168.1.1' |
GET_LOCK(name, timeout) | 應用層命名鎖(阻塞等待) | 回傳 1 成功、0 逾時、NULL 錯誤 |
RELEASE_LOCK(name) | 釋放命名鎖 | |
UUID() | 生成 UUID (RFC 4122) | UUID()='a1b2c3d4-...' |
UUID_SHORT() | 短整數唯一 ID(全域唯一) | 適合分散式 ID 生成 |
SLEEP(sec) | 休眠秒數 | 測試用 |
CAST(x AS type)/CONVERT(x, type) | 型別轉換 | CAST(100 AS CHAR(2))='10' |
| 函數 | 說明 |
|---|---|
COUNT(expr)/COUNT(DISTINCT expr) | 非 NULL 行數 / 去重計數 |
SUM/AVG/MIN/MAX([DISTINCT] expr) | 求和/平均/最小/最大 |
GROUP_CONCAT([DISTINCT] expr ORDER BY ... SEPARATOR ',') | 分組字串聚合(MySQL 特有,極實用) |
STD/STDDEV/VARIANCE/VAR_POP/VAR_SAMP | 標準差/變異數 |
BIT_AND/OR/XOR(expr) | 位元運算聚合 |
DATETIME/TIMESTAMP 儲存,勿用字串。utf8mb4,修改 my.cnf 的 character-set-server 並重啟。AES_ENCRYPT + 金鑰管理系統,勿用 MD5/PASSWORD。GROUP_CONCAT,避免應用層拼接。BENCHMARK,但注意其為客戶端計時,非伺服器 CPU 時間。