本文彙整 MySQL 常用內建函數,按功能分類並附帶語法與範例,方便開發與調優時快速查閱。函數行為可能因版本略有差異,實際使用請以官方文檔為準。
| 函數 | 說明 | 範例 |
|---|---|---|
ASCII(str) | 回傳首字元 ASCII 碼 | ASCII('A') → 65 |
CHAR(N,...) | 依 ASCII 碼組合字串 | CHAR(77,121,83,81,76) → 'MySQL' |
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('中文') → 6 (UTF8) |
CHAR_LENGTH(str) | 字元長度 | CHAR_LENGTH('中文') → 2 |
LOCATE(sub,str,[pos]) | 搜尋子字串位置(1-based) | LOCATE('bar','foobar') → 4 |
SUBSTRING(str,pos,len) | 擷取子字串 | SUBSTRING('abcdef',3,2) → 'cd' |
SUBSTRING_INDEX(str,delim,count) | 依分隔符擷取,count 正取左負取右 | SUBSTRING_INDEX('a.b.c','.',2) → 'a.b' |
TRIM([BOTH|LEADING|TRAILING] rem FROM str) | 去除首尾指定字元 | TRIM('x' FROM 'xxhelloxx') → 'hello' |
REPLACE(str,from,to) | 字串替換 | REPLACE('abc','a','x') → 'xbc' |
REVERSE(str) | 反轉字串 | REVERSE('abc') → 'cba' |
UPPER/LOWER(str) | 大小寫轉換 | UPPER('abc') → 'ABC' |
LPAD/RPAD(str,len,pad) | 左/右填充至指定長度 | LPAD('5',3,'0') → '005' |
FIND_IN_SET(str,list) | 在逗號列表中尋找位置 | FIND_IN_SET('b','a,b,c') → 2 |
ELT(N,str1,str2...) | 回傳第 N 個字串 | ELT(2,'a','b','c') → 'b' |
FIELD(str,str1,str2...) | 回傳 str 在列表中的索引 | FIELD('b','a','b','c') → 2 |
| 函數 | 說明 | 範例 |
|---|---|---|
ABS(x) | 絕對值 | ABS(-3) → 3 |
CEIL/FLOOR(x) | 向上/向下取整 | CEIL(1.2) → 2 |
ROUND(x,[d]) | 四捨五入,d 為小數位 | ROUND(1.567,2) → 1.57 |
TRUNCATE(x,d) | 直接截斷(不四捨五入) | TRUNCATE(1.567,2) → 1.56 |
MOD(n,m) | 取餘數 | MOD(10,3) → 1 |
POW(x,y) | 冪運算 | POW(2,3) → 8 |
SQRT(x) | 平方根 | SQRT(16) → 4 |
RAND([seed]) | 隨機數 0~1,種子固定則序列固定 | RAND(1) |
SIGN(x) | 正負號 | SIGN(-5) → -1 |
EXP/LOG/LOG10/LN | 指數/對數 | EXP(1) → 2.718... |
PI() | 圓周率 | PI() → 3.141593 |
SIN/COS/TAN | 三角函數(弧度) | SIN(PI()/2) → 1 |
DEGREES/RADIANS | 角度弧度互換 | DEGREES(PI()) → 180 |
LEAST/GREATEST(v1,v2...) | 最小/最大值 | GREATEST(3,5,1) → 5 |
| 函數 | 說明 | 範例 |
|---|---|---|
NOW()/SYSDATE() | 當前日期時間 | NOW() → '2024-01-15 10:30:00' |
CURDATE()/CURTIME() | 當前日期/時間 | CURDATE() → '2024-01-15' |
DATE_ADD/DATE_SUB(date, INTERVAL expr unit) | 日期加減 | DATE_ADD(NOW(), INTERVAL 1 DAY) |
DATEDIFF(d1,d2) | 兩日期差天數 | DATEDIFF('2024-01-15','2024-01-10') → 5 |
DATE_FORMAT(date,format) | 格式化輸出 | DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i') |
STR_TO_DATE(str,format) | 字串解析為日期 | STR_TO_DATE('2024-01-15','%Y-%m-%d') |
UNIX_TIMESTAMP([date]) | 轉 Unix 時間戳 | UNIX_TIMESTAMP() → 1705285800 |
FROM_UNIXTIME(ts,[format]) | 時間戳轉日期 | FROM_UNIXTIME(1705285800) |
EXTRACT(unit FROM date) | 提取日期部分 | EXTRACT(MONTH FROM NOW()) |
DAYOFWEEK/WEEKDAY | 星期幾(1=週日/0=週一) | WEEKDAY('2024-01-15') → 0 |
LAST_DAY(date) | 該月最後一天 | LAST_DAY('2024-02-10') → '2024-02-29' |
QUARTER/WEEK/MONTH/YEAR | 提取季/週/月/年 | QUARTER(NOW()) → 1 |
SEC_TO_TIME/TIME_TO_SEC | 秒與 TIME 互換 | TIME_TO_SEC('01:00:00') → 3600 |
常用格式符號: %Y 四位年 %m 月(01-12) %d 日(01-31) %H 時(00-23) %i 分 %s 秒 %W 週名 %M 月名
| 函數 | 說明 | 範例 |
|---|---|---|
IF(expr, true_val, false_val) | 條件判斷 | IF(1>0,'yes','no') → 'yes' |
CASE WHEN ... THEN ... ELSE ... END | 多條件分支 | 見下方範例 |
COALESCE(v1,v2,...) | 回傳第一個非 NULL 值 | COALESCE(NULL,NULL,'a') → 'a' |
NULLIF(expr1,expr2) | 相等回傳 NULL,否則 expr1 | NULLIF(5,5) → NULL |
IFNULL(expr1,expr2) | expr1 非 NULL 回傳 expr1,否則 expr2 | IFNULL(NULL,'x') → 'x' |
-- CASE 範例
SELECT CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 60 THEN 'B'
ELSE 'C'
END AS grade FROM student;
| 函數 | 說明 | 範例 |
|---|---|---|
CAST(expr AS type) | 標準 SQL 轉型 | CAST('123' AS UNSIGNED) → 123 |
CONVERT(expr, type) | MySQL 擴充轉型(也可用於字元集轉換) | CONVERT('abc' USING utf8mb4) |
BIN/OCT/HEX/CONV | 進制轉換 | HEX(255) → 'FF' |
VERSION()、CONNECTION_ID()、DATABASE()、USER()、LAST_INSERT_ID()、ROW_COUNT()MD5()、SHA1()、SHA2(str,256/512)、AES_ENCRYPT/DECRYPT、PASSWORD()(已棄用)COUNT/SUM/AVG/MIN/MAX/GROUP_CONCATROW_NUMBER()、RANK()、DENSE_RANK()、LEAD/LAG()、FIRST_VALUE/LAST_VALUE()、NTILE(),需搭配 OVER (PARTITION BY ... ORDER BY ...) 使用。JSON_OBJECT()、JSON_ARRAY()、JSON_QUOTE()JSON_EXTRACT(doc, path)、->、->> 操作符JSON_SET/INSERT/REPLACE/REMOVE()JSON_VALID()、JSON_TYPE()、JSON_CONTAINS()