一、字符串處理函數
| 函數 | 說明 | 示例 |
| LEFT(str, n) | 左起 n 字符 | `LEFT('abcdef', 3)` → `'abc'` |
| RIGHT(str, n) | 右起 n 字符 | `RIGHT('abcdef', 3)` → `'def'` |
| LENGTH(str) | 字節長度 | `LENGTH('中文')` → `6` (utf8mb4) |
| CHAR_LENGTH(str) | 字符長度 | `CHAR_LENGTH('中文')` → `2` |
| LOCATE(sub, str) | 子串位置 (1-based) | `LOCATE('cd', 'abcdef')` → `3` |
| LOWER(str) | 轉小寫 | `LOWER('ABC')` → `'abc'` |
| UPPER(str) | 轉大寫 | `UPPER('abc')` → `'ABC'` |
| LTRIM(str) | 去左空格 | `LTRIM(' a')` → `'a'` |
| RTRIM(str) | 去右空格 | `RTRIM('a ')` → `'a'` |
| TRIM(str) | 去兩端空格 | `TRIM(' a ')` → `'a'` |
| SUBSTRING(str, pos, len) | 截取子串 | `SUBSTRING('abcdef', 2, 3)` → `'bcd'` |
| CONCAT(str1, str2...) | 拼接 (任一 NULL 結果 NULL) | `CONCAT('a', 'b')` → `'ab'` |
| CONCAT_WS(sep, ...) | 帶分隔符拼接 (跳過 NULL) | `CONCAT_WS(',', 'a', NULL, 'c')` → `'a,c'` |
| REPLACE(str, from, to) | 替換 | `REPLACE('a b', ' ', '-')` → `'a-b'` |
| SOUNDEX(str) | 發音編碼 (模糊匹配) | `SOUNDEX('Smith')` = `SOUNDEX('Smyth')` |
二、日期時間處理函數
| 函數 | 說明 | 示例 |
| NOW() | 當前日期時間 | `2024-01-15 14:30:00` |
| CURDATE() | 當前日期 | `2024-01-15` |
| CURTIME() | 當前時間 | `14:30:00` |
| DATE(expr) | 提取日期部分 | `DATE('2024-01-15 14:30:00')` → `'2024-01-15'` |
| TIME(expr) | 提取時間部分 | `TIME('2024-01-15 14:30:00')` → `'14:30:00'` |
| YEAR/MONTH/DAY(expr) | 提取年/月/日 | `MONTH('2024-01-15')` → `1` |
| HOUR/MINUTE/SECOND(expr) | 提取時/分/秒 | `HOUR('14:30:00')` → `14` |
| DATE_ADD(date, INTERVAL n UNIT) | 日期加減 | `DATE_ADD('2024-01-15', INTERVAL 7 DAY)` → `'2024-01-22'` |
| DATE_SUB(date, INTERVAL n UNIT) | 日期減法 | `DATE_SUB(NOW(), INTERVAL 1 MONTH)` |
| DATEDIFF(date1, date2) | 天數差 (date1 - date2) | `DATEDIFF('2024-01-15', '2024-01-01')` → `14` |
| DATE_FORMAT(date, fmt) | 格式化輸出 | `DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')` |
| STR_TO_DATE(str, fmt) | 字符串解析為日期 | `STR_TO_DATE('15/01/2024', '%d/%m/%Y')` |
| DAYOFWEEK(date) | 星期 (1=周日...7=周六) | `DAYOFWEEK('2024-01-15')` → `2` |
| DAYOFYEAR(date) | 一年第幾天 | `DAYOFYEAR('2024-01-15')` → `15` |
| LAST_DAY(date) | 當月最後一天 | `LAST_DAY('2024-02-10')` → `'2024-02-29'` |
三、日期查詢最佳實踐
查某一天數據 (正確 ✅)
SELECT * FROM orders
WHERE DATE(order_date) = '2024-01-15';
-- 或範圍查詢 (可用索引)
SELECT * FROM orders
WHERE order_date >= '2024-01-15'
AND order_date < '2024-01-16';
查某月數據 (正確 ✅)
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
AND order_date < '2024-02-01';
-- 或 (不可用索引)
SELECT * FROM orders
WHERE YEAR(order_date) = 2024 AND MONTH(order_date) = 1;
錯誤寫法 ❌
WHERE order_date = '2024-01-15' -- datetime 不會等於純日期字符串
四、數值處理函數
| 函數 | 說明 | 示例 |
| ABS(x) | 絕對值 | `ABS(-5)` → `5` |
| CEIL(x) / CEILING(x) | 向上取整 | `CEIL(5.1)` → `6` |
| FLOOR(x) | 向下取整 | `FLOOR(5.9)` → `5` |
| ROUND(x, d) | 四捨五入保留 d 位小數 | `ROUND(5.678, 2)` → `5.68` |
| TRUNCATE(x, d) | 截斷保留 d 位 (不四捨五入) | `TRUNCATE(5.678, 2)` → `5.67` |
| MOD(n, m) / n % m | 取模 | `MOD(10, 3)` → `1` |
| POW(x, y) / POWER(x, y) | 冪 | `POW(2, 3)` → `8` |
| SQRT(x) | 平方根 | `SQRT(16)` → `4` |
| RAND() | 0-1 隨機數 | `FLOOR(RAND() * 100)` → 0-99 |
| PI() | 圓周率 | `PI()` → `3.141593` |
| SIN/COS/TAN(x) | 三角函數 (弧度制) | `SIN(PI()/2)` → `1` |
| EXP(x) | e^x | `EXP(1)` → `2.718` |
| LOG(x) / LN(x) | 自然對數 | `LOG(10)` → `2.302` |
| LOG10(x) | 以 10 為底對數 | `LOG10(100)` → `2` |
| SIGN(x) | 符號 (-1/0/1) | `SIGN(-5)` → `-1` |
五、SOUNDEX 發音匹配實戰
-- 查找發音相似的姓名
SELECT * FROM users
WHERE SOUNDEX(name) = SOUNDEX('Li Si'); -- 能匹配 'Lee Si', 'Li Xi' 等
適用於姓名/地址模糊檢索,但**不支援中文拼音**,中文需用全文索引/拼音分表。