MySQL 核心函數分類參考手冊:語法、範例與實務應用場景
MySQL 提供超過 200 個內建函數,掌握高頻函數能大幅提升 SQL 表達力與效能。本文按功能領域分類整理,附帶實戰範例與避坑提醒。
聚合函數 — 分組統計核心
| 函數 | 用途 | 範例 |
| COUNT(expr) | 計算非 NULL 列數 | COUNT(*)、COUNT(DISTINCT col) |
| SUM(expr) | 數值加總 | SUM(amount) |
| AVG(expr) | 平均值 | AVG(score) |
| MAX(expr) / MIN(expr) | 極值 | MAX(created_at) |
| GROUP_CONCAT(expr SEPARATOR ',') | 群組字串串接 | GROUP_CONCAT(tag ORDER BY tag SEPARATOR '|') |
| STDDEV_POP / VARIANCE | 標準差/變異數 | 統計分析 |
注意:聚合函數自動忽略 NULL 值;搭配 GROUP BY 使用時,SELECT 清單中非聚合欄位必須出現在 GROUP BY 中(ONLY_FULL_GROUP_BY 模式)。
字串函數 — 文本處理利器
| 函數 | 用途 | 範例 |
| CONCAT(str1, str2, ...) | 串接字串 | CONCAT(first_name, ' ', last_name) |
| CONCAT_WS(sep, str1, str2) | 帶分隔符串接 | CONCAT_WS('-', year, month, day) |
| SUBSTRING(str, pos, len) | 擷取子字串 | SUBSTRING(phone, 1, 3) 取區碼 |
| REPLACE(str, from, to) | 全域取代 | REPLACE(desc, '舊', '新') |
| TRIM([BOTH|LEADING|TRAILING] 'x' FROM str) | 去除首尾字元 | TRIM(' abc ') → 'abc' |
| UPPER/LOWER | 大小寫轉換 | UPPER(email) |
| LENGTH/CHAR_LENGTH | 位元組/字元長度 | CHAR_LENGTH(中文) 計字數 |
| LOCATE(substr, str) | 搜尋子字串位置 | LOCATE('@', email) |
| LEFT/RIGHT(str, len) | 左/右擷取 | LEFT(id_no, 1) 取性別碼 |
日期時間函數 — 時間運算核心
| 函數 | 用途 | 範例 |
| NOW() / CURRENT_TIMESTAMP | 當前日期時間 | INSERT ... VALUES (NOW()) |
| CURDATE() / CURTIME() | 當前日期/時間 | WHERE dt >= CURDATE() |
| DATE_ADD / DATE_SUB | 日期加減 | DATE_ADD(NOW(), INTERVAL 7 DAY) |
| DATEDIFF(d1, d2) | 天數差 | DATEDIFF(expire, NOW()) |
| DATE_FORMAT(dt, fmt) | 格式化輸出 | DATE_FORMAT(created, '%Y-%m') |
| STR_TO_DATE(str, fmt) | 字串轉日期 | STR_TO_DATE('20230101', '%Y%m%d') |
| YEAR/MONTH/DAY/HOUR/MINUTE/SECOND | 擷取元件 | MONTH(created_at) |
| LAST_DAY(date) | 月份最後一天 | LAST_DAY('2023-02-01') → 2023-02-28 |
| WEEKDAY / DAYOFWEEK | 星期索引 | WEEKDAY(NOW()) 0=週一 |
數學函數 — 計算輔助
| 函數 | 用途 | 範例 |
| ROUND(x, d) | 四捨五入 | ROUND(price, 2) |
| CEIL / FLOOR | 無條件進位/捨去 | CEIL(total / page_size) |
| RAND([seed]) | 隨機數 0~1 | ORDER BY RAND() LIMIT 10 |
| POWER(x, y) / SQRT(x) | 冪/平方根 | 距離計算 |
| ABS(x) / SIGN(x) | 絕對值/符號 | ABS(balance) |
| MOD(n, m) / n % m | 取餘 | 分表路由 MOD(uid, 16) |
| PI() | 圓周率 | 幾何計算 |
流程控制函數 — 條件邏輯
| 函數 | 語法 | 範例 |
| IF(cond, true_val, false_val) | 三元運算 | IF(score>=60, 'PASS', 'FAIL') |
| CASE WHEN cond1 THEN v1 WHEN cond2 THEN v2 ELSE v3 END | 多條件分支 | CASE WHEN age<18 THEN '兒' WHEN age<65 THEN '成' ELSE '長' END |
| COALESCE(v1, v2, ...) | 回傳首個非 NULL | COALESCE(mobile, phone, '無') |
| NULLIF(v1, v2) | 相等回 NULL | NULLIF(qty, 0) 避免除零 |
| IFNULL(v1, v2) | MySQL 專用 COALESCE 兩參數版 | IFNULL(discount, 0) |
條件查詢子句 — 常搭配函數使用
IN (val1, val2, ...):離散值匹配,WHERE status IN (1,2,3)
BETWEEN low AND high:區間匹配,WHERE created BETWEEN '2023-01-01' AND '2023-12-31'
UNION / UNION ALL:合併結果集,ALL 保留重複列。
實務避坑提醒
- 函數索引失效:
WHERE YEAR(created) = 2023 無法使用 created 索引,改寫為 WHERE created >= '2023-01-01' AND created < '2024-01-01'。
- 字元集陷阱:
LENGTH 回傳位元組數,中文 UTF8MB4 佔 4 字節,統計字數請用 CHAR_LENGTH。
- 時區一致性:
NOW() 受 session time_zone 影響,跨時區系統建議統一儲存 UTC,應用層轉換。
- RAND() 效能:大表
ORDER BY RAND() 會產生臨時表排序,改用 WHERE id >= (SELECT FLOOR(RAND() * MAX(id)) FROM t) LIMIT 1。