聚合函數
對一組值計算並返回單一值,常配合 GROUP BY 使用。
| 函數 | 說明 | 示例 |
| AVG(expr) | 平均值 | SELECT AVG(salary) FROM employees; |
| COUNT(expr) | 非 NULL 行數 | SELECT COUNT(*) FROM orders; |
| MAX(expr) | 最大值 | SELECT MAX(price) FROM products; |
| MIN(expr) | 最小值 | SELECT MIN(age) FROM users; |
| SUM(expr) | 總和 | SELECT SUM(amount) FROM payments; |
| GROUP_CONCAT(expr) | 分組拼接字符串 (MySQL 特有) | SELECT GROUP_CONCAT(name) FROM users GROUP BY dept; |
注意:FIRST()、LAST() 非標準 SQL,MySQL 不支持;請用 ORDER BY ... LIMIT 1 替代。
標量函數
針對單個值操作,返回單個值,可用於 SELECT、WHERE、ORDER BY 等子句。
字符串函數
| 函數 | 說明 |
| UPPER(str) / UCASE(str) | 轉大寫 |
| LOWER(str) / LCASE(str) | 轉小寫 |
| SUBSTRING(str, pos, len) / MID(str, pos, len) | 截取子串 |
| LENGTH(str) / CHAR_LENGTH(str) | 字節長度 / 字符長度 |
| TRIM([BOTH|LEADING|TRAILING] remstr FROM str) | 去除首尾空格或指定字符 |
| REPLACE(str, from_str, to_str) | 替換子串 |
| CONCAT(str1, str2, ...) | 拼接字符串 |
| LEFT(str, len) / RIGHT(str, len) | 左/右側定長截取 |
數值函數
| 函數 | 說明 |
| ROUND(num, decimals) | 四捨五入保留小數位 |
| CEIL(num) / CEILING(num) | 向上取整 |
| FLOOR(num) | 向下取整 |
| ABS(num) | 絕對值 |
| MOD(n, m) / n % m | 取模 |
| RAND([seed]) | 隨機數 (0~1) |
日期時間函數
| 函數 | 說明 |
| NOW() / CURRENT_TIMESTAMP() | 當前日期時間 |
| CURDATE() / CURRENT_DATE() | 當前日期 |
| CURTIME() / CURRENT_TIME() | 當前時間 |
| DATE_ADD(date, INTERVAL expr unit) | 日期加減間隔 |
| DATEDIFF(date1, date2) | 兩日期相差天數 |
| DATE_FORMAT(date, format) | 日期格式化輸出 |
| STR_TO_DATE(str, format) | 字符串解析為日期 |
| UNIX_TIMESTAMP([date]) | 日期轉 Unix 時間戳 |
| FROM_UNIXTIME(ts) | 時間戳轉日期 |
流程控制函數
| 函數 | 說明 |
| IF(condition, true_val, false_val) | 條件判斷 |
| CASE WHEN cond1 THEN val1 ... ELSE valN END | 多條件分支 |
| COALESCE(val1, val2, ...) | 返回第一個非 NULL 值 |
| NULLIF(expr1, expr2) | 相等返回 NULL,否則返回 expr1 |
使用建議
- 可移植性:優先使用 ANSI SQL 標準函數 (
UPPER、SUBSTRING、COALESCE),減少遷移成本。
- 性能:WHERE 子句中對列使用函數會導致索引失效,改寫為
col = UPPER('val') 或使用函數索引 (MySQL 8.0+ 支持)。
- 時區:
NOW() 受會話時區影響,跨時區應用建議存儲 UTC 時間戳 (BIGINT) 或使用 TIMESTAMP 類型。