在資料庫層面完成數據清洗、格式轉換、計算比在應用層處理更高效,且減少網路傳輸。MySQL 提供豐富的標量函數,分為文本、日期時間、數值三大類。使用專有函數會降低 SQL 可移植性,跨庫遷移時需注意。
| 函數 | 說明 |
|---|---|
UPPER(str) / UCASE(str) | 轉大寫 |
LOWER(str) / LCASE(str) | 轉小寫 |
LTRIM(str) | 去除左側空格 |
RTRIM(str) | 去除右側空格 |
TRIM([BOTH|LEADING|TRAILING] [remstr] FROM str) | 去除首尾指定字符(默認空格) |
LEFT(str, len) | 取左側 len 字符 |
RIGHT(str, len) | 取右側 len 字符 |
SUBSTRING(str, pos[, len]) / MID(str, pos, len) | 截取子串 |
LENGTH(str) | 返回字節長度 |
CHAR_LENGTH(str) | 返回字符數 |
LOCATE(substr, str[, start]) | 查找子串位置(1-based) |
REPLACE(str, from, to) | 替換所有匹配子串 |
CONCAT(str1, str2, ...) | 拼接字符串(任一為 NULL 結果為 NULL) |
CONCAT_WS(sep, str1, str2, ...) | 帶分隔符拼接,自動跳過 NULL |
SOUNDEX(str) | 返回發音編碼,用於模糊音匹配 |
SELECT UPPER(prod_name) AS upper_name FROM products;

真名 Y.Lee 存為 Y.Lie,LIKE 無法匹配,用 SOUNDEX:
SELECT * FROM contacts WHERE SOUNDEX(contact_name) = SOUNDEX('Y.Lee');

| 函數 | 說明 |
|---|---|
NOW() / SYSDATE() | 當前日期時間 |
CURDATE() / CURRENT_DATE() | 當前日期 |
CURTIME() / CURRENT_TIME() | 當前時間 |
DATE(expr) | 提取日期部分 |
TIME(expr) | 提取時間部分 |
YEAR(date) / MONTH(date) / DAY(date) | 提取年/月/日 |
HOUR(time) / MINUTE(time) / SECOND(time) | 提取時/分/秒 |
DATE_ADD(date, INTERVAL expr unit) | 日期加減(靈活單位:DAY, MONTH, YEAR, HOUR...) |
DATE_SUB(date, INTERVAL expr unit) | 日期減法 |
DATEDIFF(date1, date2) | 兩日期相差天數 |
DATE_FORMAT(date, format) | 按格式字符串輸出日期 |
DAYOFWEEK(date) | 星期幾(1=Sunday) |
SELECT * FROM orders WHERE DATE(order_date) = '2023-08-15';

SELECT * FROM orders WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

| 函數 | 說明 |
|---|---|
ABS(x) | 絕對值 |
CEIL(x) / CEILING(x) | 向上取整 |
FLOOR(x) | 向下取整 |
ROUND(x[, d]) | 四捨五入保留 d 位小數 |
MOD(x, y) / x % y | 取模(餘數) |
POW(x, y) / POWER(x, y) | 冪運算 |
SQRT(x) | 平方根 |
RAND([seed]) | 隨機數(0-1) |
SIN(x) / COS(x) / TAN(x) | 三角函數(弧度制) |
PI() | 圓周率 |
EXP(x) | e 的 x 次方 |
LOG(x) / LN(x) | 自然對數 |
LOG10(x) | 以 10 為底對數 |
SELECT TAN(PI()/4); -- 返回 1

UPPER、LOWER、SUBSTRING、CURRENT_DATE),盡量優先使用標準寫法。