MySQL 常用函數速查手冊:日期、字符串、數值、條件、全文搜索
整理開發高頻使用的 MySQL 內建函數,含語法、參數、示例與實戰技巧,適合作為桌面速查卡。
字符串函數
| 函數 | 語法 | 示例 | 結果/說明 |
| LEFT | LEFT(str, len) | LEFT('abcdef', 3) | 'abc' - 截取左側 |
| RIGHT | RIGHT(str, len) | RIGHT('abcdef', 3) | 'def' - 截取右側 |
| SUBSTRING | SUBSTRING(str, pos, len) | SUBSTRING('abcdef', 2, 3) | 'bcd' - 1-based 位置 |
| CONCAT | CONCAT(str1, str2, ...) | CONCAT('a','b','c') | 'abc' - 任一參數為 NULL 結果為 NULL |
| CONCAT_WS | CONCAT_WS(sep, str1, str2...) | CONCAT_WS('-', '2024','01','15') | '2024-01-15' - 跳過 NULL |
| REPLACE | REPLACE(str, from, to) | REPLACE('a.b.c', '.', '_') | 'a_b_c' - 全局替換 |
| TRIM | TRIM([BOTH|LEADING|TRAILING] rem FROM str) | TRIM(' abc ') | 'abc' - 去除首尾空格 |
| LENGTH | LENGTH(str) | LENGTH('中文') | 6 - 字節長度 (UTF-8 中文 3 字節) |
| CHAR_LENGTH | CHAR_LENGTH(str) | CHAR_LENGTH('中文') | 2 - 字符長度 |
| LOWER/UPPER | LOWER(str)/UPPER(str) | LOWER('ABC') | 'abc' / 'ABC' |
| REVERSE | REVERSE(str) | REVERSE('abc') | 'cba' |
| LOCATE | LOCATE(substr, str, [pos]) | LOCATE('b', 'abc') | 2 - 位置,未找到返回 0 |
| STRCMP | STRCMP(str1, str2) | STRCMP('a','b') | -1/0/1 - 比較結果 |
日期時間函數
| 函數 | 語法 | 示例 | 結果/說明 |
| NOW / CURRENT_TIMESTAMP | NOW() | NOW() | 2024-01-15 14:30:45 - 日期時間 |
| CURDATE / CURRENT_DATE | CURDATE() | CURDATE() | 2024-01-15 - 僅日期 |
| CURTIME / CURRENT_TIME | CURTIME() | CURTIME() | 14:30:45 - 僅時間 |
| DATE | DATE(datetime) | DATE(NOW()) | 2024-01-15 - 提取日期部分 |
| DATE_FORMAT | DATE_FORMAT(date, format) | DATE_FORMAT(NOW(), '%Y-%m-%d') | 格式化輸出 |
| STR_TO_DATE | STR_TO_DATE(str, format) | STR_TO_DATE('20240115', '%Y%m%d') | 2024-01-15 - 字符串轉日期 |
| FROM_UNIXTIME | FROM_UNIXTIME(ts, [format]) | FROM_UNIXTIME(1705312245) | 時間戳轉日期時間 |
| UNIX_TIMESTAMP | UNIX_TIMESTAMP([date]) | UNIX_TIMESTAMP() | 當前/指定時間轉時間戳 |
| DATE_ADD / DATE_SUB | DATE_ADD(date, INTERVAL expr unit) | DATE_ADD(NOW(), INTERVAL 1 DAY) | 日期加減 |
| DATEDIFF | DATEDIFF(date1, date2) | DATEDIFF('2024-01-15', '2024-01-01') | 14 - 日期差(天) |
| TIMESTAMPDIFF | TIMESTAMPDIFF(unit, dt1, dt2) | TIMESTAMPDIFF(SECOND, dt1, dt2) | 精確時間差(秒/分/時/天/月/年) |
| LAST_DAY | LAST_DAY(date) | LAST_DAY('2024-02-10') | 2024-02-29 - 月末日期 |
| DAYOFWEEK | DAYOFWEEK(date) | DAYOFWEEK(NOW()) | 1=周日 ... 7=周六 |
| WEEK | WEEK(date, [mode]) | WEEK(NOW()) | 年第幾周 |
| QUARTER | QUARTER(date) | QUARTER(NOW()) | 1-4 季度 |
常用格式化符號
%Y 四位年份 (2024) %y 兩位年份 (24)
%m 月份 01-12 %c 月份 1-12
%d 日期 01-31 %e 日期 1-31
%H 小時 00-23 %h 小時 01-12
%i 分鐘 00-59 %s 秒 00-59
%W 星期名稱 %a 縮寫星期
%M 月份名稱 %b 縮寫月份
數值/聚合函數
| 函數 | 語法 | 示例 | 說明 |
| MAX/MIN | MAX(col) | MAX(salary) | 最大/最小值 |
| SUM | SUM(col) | SUM(amount) | 求和 |
| AVG | AVG(col) | AVG(score) | 平均值 |
| COUNT | COUNT(*) / COUNT(col) | COUNT(*) | 行數 / 非NULL值個數 |
| FORMAT | FORMAT(num, decimals) | FORMAT(12345.678, 2) | '12,345.68' - 千分位格式化 |
| ROUND | ROUND(num, [decimals]) | ROUND(3.14159, 2) | 3.14 - 四捨五入 |
| CEIL/FLOOR | CEIL(num)/FLOOR(num) | CEIL(3.2) | 4 / 3 - 向上/向下取整 |
| MOD | MOD(n, m) | MOD(10, 3) | 1 - 取模 |
| POW | POW(x, y) | POW(2, 10) | 1024 - 次方 |
| RAND | RAND([seed]) | RAND() | 0-1 隨機數 |
條件/流程控制函數
| 函數 | 語法 | 示例 | 說明 |
| IF | IF(cond, true_val, false_val) | IF(score>=60, '及格', '不及格') | 三元運算 |
| CASE | CASE WHEN cond THEN val ... ELSE val END | CASE WHEN age<18 THEN '未成年' ELSE '成年' END | 多分支 |
| COALESCE | COALESCE(v1, v2, ...) | COALESCE(mobile, email, '無') | 首個非NULL |
| NULLIF | NULLIF(v1, v2) | NULLIF(status, 0) | 相等返回NULL |
| IFNULL | IFNULL(v1, v2) | IFNULL(bonus, 0) | MySQL專用,同COALESCE兩參數 |
NULL 判斷操作符
IS NULL -- 是NULL
IS NOT NULL -- 非NULL
<=> -- NULL安全等價 (NULL<=>NULL 為TRUE)
IN / NOT IN / BETWEEN / LIKE
WHERE id IN (1,2,3,100)
WHERE name IN ('Alice','Bob')
WHERE id NOT IN (SELECT id FROM blacklist)
WHERE age BETWEEN 18 AND 60
WHERE name LIKE '張%' -- 以張開頭
WHERE name LIKE '%偉' -- 以偉結尾
WHERE name LIKE '%明%' -- 包含明
WHERE name LIKE '_偉' -- 兩字且第二字為偉
WHERE name NOT LIKE '%測試%' -- 排除包含測試
全文搜索 (需 FULLTEXT 索引)
-- 自然語言模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('MySQL 優化');
-- 布爾模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('+MySQL -舊版' IN BOOLEAN MODE);
-- 查詢擴展模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('數據庫' WITH QUERY EXPANSION);
⚠️ MySQL 內置全文索引不支持中文分詞 (5.7+ ngram parser 除外),中文場景建議使用 Elasticsearch。
常用管理命令速查
| 操作 | 命令 |
| 啟動/停止服務 | service mysqld start/stop / systemctl start/stop mysqld |
| 登錄 | mysql -u root -p |
| 顯示庫 | SHOW DATABASES; |
| 選庫 | USE db_name; |
| 顯示表 | SHOW TABLES; |
| 表結構 | DESC table_name; / SHOW COLUMNS FROM table_name; |
| 建庫/刪庫 | CREATE/DROP DATABASE db_name; |
| 建表 | CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(50)); |
| 插入 | INSERT INTO t VALUES (1, 'test'); |
| 更新 | UPDATE t SET name='new' WHERE id=1; |
| 刪除/清空 | DELETE FROM t WHERE id=1; / TRUNCATE TABLE t; |
| 授權 | GRANT SELECT,INSERT ON db.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES; |
| 修改密碼 | ALTER USER 'user'@'host' IDENTIFIED BY 'newpass'; (8.0+) |
| 退出 | EXIT; / QUIT; |
實戰技巧集錦
- 批量更新域名:
UPDATE software SET icon = CONCAT('https://cdn.example.com', icon);
- 時間戳轉日期查詢:
WHERE DATE(FROM_UNIXTIME(create_time)) = '2024-01-15'
- 月份分組統計:
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, COUNT(*) FROM orders GROUP BY month
- 去重統計:
SELECT DISTINCT city FROM users 或 SELECT city, COUNT(*) FROM users GROUP BY city
- 左連接找孤兒數據:
SELECT a.* FROM users a LEFT JOIN profiles b ON a.id = b.user_id WHERE b.user_id IS NULL