一、字串處理函數
| 函數 | 說明 | 範例 |
CONCAT(str1,str2,...) | 串接字串 | CONCAT('My','SQL') → 'MySQL' |
LENGTH(str) | 位元組長度 | LENGTH('中文') → 6 (UTF8) |
CHAR_LENGTH(str) | 字元長度 | CHAR_LENGTH('中文') → 2 |
LOWER/UPPER(str) | 大小寫轉換 | |
TRIM([BOTH|LEADING|TRAILING] rem FROM str) | 去除首尾空格或指定字元 | |
LEFT(str, len) / RIGHT(str, len) | 取左/右指定長度 | |
SUBSTRING(str, pos, len) | 截取子串 | |
LOCATE(substr, str) | 尋找子串位置 | |
REPLACE(str, from, to) | 替換字串 | |
SOUNDEX(str) | 發音編碼(英文名模糊匹配) | SOUNDEX('Lee') = SOUNDEX('Lie') |
二、日期時間函數
| 函數 | 說明 |
NOW() / CURRENT_TIMESTAMP | 目前日期時間 |
CURDATE() / CURRENT_DATE | 目前日期 |
CURTIME() / CURRENT_TIME | 目前時間 |
DATE(expr) | 擷取日期部份 |
TIME(expr) | 擷取時間部份 |
YEAR/MONTH/DAY/HOUR/MINUTE/SECOND(date) | 擷取對應部份 |
DATE_ADD(date, INTERVAL expr unit) | 日期加法 |
DATE_SUB(date, INTERVAL expr unit) | 日期減法 |
DATEDIFF(date1, date2) | 兩日期相差天數 |
DATE_FORMAT(date, format) | 格式化輸出 |
STR_TO_DATE(str, format) | 字串解析為日期 |
DAYOFWEEK(date) | 星期索引 (1=Sun) |
WEEKDAY(date) | 星期索引 (0=Mon) |
QUARTER(date) | 季度 (1-4) |
常見查詢模式
-- 某一天的資料(正確)
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;
三、數值處理函數
| 函數 | 說明 |
ABS(x) | 絕對值 |
CEIL(x) / FLOOR(x) | 向上/向下取整 |
ROUND(x, d) | 四捨五入保留 d 位小數 |
MOD(n, m) | 取餘 |
POW(x, y) / POWER(x, y) | 冪運算 |
SQRT(x) | 平方根 |
RAND() | 隨機數 0-1 |
SIN/COS/TAN(x) | 三角函數(弧度) |
PI() | 圓周率 |
EXP(x) | e^x |
LOG(x) / LOG10(x) | 自然/常用對數 |
提醒
函數在 WHERE 條件欄位上使用會導致索引失效,盡量改寫為範圍查詢或使用函數索引(MySQL 8.0+ 支援)。