MySQL 常用函數完整指南:從數學運算到加密處理
MySQL 資料庫內建了豐富的函數庫,涵蓋數學運算、字串處理、日期時間、條件判斷、系統資訊、加密解密以及格式化等七大類別。善用這些函數能大幅簡化 SQL 查詢與資料處理邏輯,讓資料庫操作更靈活高效。本文將系統整理各類函數的語法、參數與實戰範例,協助開發者快速查找並正確應用。
一、數學函數
數學函數主要處理數值型資料(整數、浮點數),常用於統計計算、資料清洗等場景。
1. 絕對值與餘數
- ABS(X):回傳 X 的絕對值。
SELECT ABS(-32); -- 32
- MOD(N, M) / N % M:回傳 N 除以 M 的餘數。
SELECT MOD(15, 7); -- 1
2. 取整與四捨五入
- FLOOR(X):回傳不大於 X 的最大整數(向下取整)。
SELECT FLOOR(1.23); -- 1、SELECT FLOOR(-1.23); -- -2
- CEILING(X):回傳不小於 X 的最小整數(向上取整)。
SELECT CEILING(1.23); -- 2
- ROUND(X):四捨五入至整數。
SELECT ROUND(1.58); -- 2、SELECT ROUND(-1.58); -- -2
二、字串函數
字串函數是處理文字資料的核心工具,包含查詢、截取、替換、大小寫轉換等操作。
1. 基礎查詢與長度
- ASCII(str):回傳字串最左字元的 ASCII 碼。空字串回傳 0,NULL 回傳 NULL。
- LENGTH(str):回傳字串長度(位元組數)。
2. 字串連接與搜尋
- CONCAT(str1, str2, ...):連接多個字串,任一參數為 NULL 則結果為 NULL。
- LOCATE(substr, str) / INSTR(str, substr):搜尋子字串首次出現位置,未找到回傳 0。注意參數順序不同。
3. 截取與修剪
- LEFT(str, len) / RIGHT(str, len):取左/右側指定長度字元。
- SUBSTRING(str, pos):從指定位置開始截取至結尾。
- TRIM(str) / LTRIM(str) / RTRIM(str):移除首尾/左側/右側空白字元。
4. 替換與進階操作
- REPLACE(str, from_str, to_str):將所有 from_str 替換為 to_str。
- REPEAT(str, count):重複字串 count 次。
- REVERSE(str):反轉字串順序。
- INSERT(str, pos, len, newstr):在 pos 位置替換 len 長度字元為 newstr。
三、日期與時間函數
MySQL 提供完整的日期時間處理能力,支援年月日、時分秒、星期、季度等多維度提取與運算。
1. 日期部份提取
- DAYOFWEEK(date):星期索引(1=週日...7=週六)
- WEEKDAY(date):星期索引(0=週一...6=週日)
- DAYOFMONTH(date):月份中的第幾天(1-31)
- DAYOFYEAR(date):年份中的第幾天(1-366)
- MONTH(date) / MONTHNAME(date):月份數值/名稱
- DAYNAME(date):星期名稱
- QUARTER(date):季度(1-4)
- YEAR(date):年份(1000-9999)
- HOUR(time) / MINUTE(time) / SECOND(time):時/分/秒
2. 週數計算
WEEK(date, mode):mode=0 週日為週首,mode=1 週一為週首。
3. 日期加減運算
- DATE_ADD(date, INTERVAL expr unit):日期加法
- DATE_SUB(date, INTERVAL expr unit):日期減法
- 支援單位:SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR 及組合單位(如 MINUTE_SECOND, DAY_HOUR 等)
SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND);
SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
4. 當前日期時間
- CURDATE() / CURRENT_DATE:目前日期(YYYY-MM-DD)
- CURTIME() / CURRENT_TIME:目前時間(HH:MM:SS)
- NOW():目前日期時間(YYYY-MM-DD HH:MM:SS)
四、流程控制函數
在 SQL 中實現條件邏輯判斷,類似程式語言的 if-else 或 switch-case。
1. CASE 運算式
-- 簡單 CASE
SELECT CASE 11 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
-- 搜尋 CASE
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
2. IF 函數
IF(expr1, expr2, expr3):expr1 為真回傳 expr2,否則回傳 expr3。
SELECT IF(1>2, 2, 3); -- 3
SELECT IF(1<2, 'yes', 'no'); -- 'yes'
3. 字串比較
- STRCMP(expr1, expr2):相等回傳 0,expr1
五、系統資訊函數
用於查詢資料庫運行環境、連線資訊、字元集等中繼資料。
- VERSION():資料庫版本號
- CONNECTION_ID():目前連線 ID(連線計數)
- DATABASE() / SCHEMA():目前資料庫名稱
- USER() / CURRENT_USER() / SESSION_USER() / SYSTEM_USER():目前使用者帳號
- CHARSET(str) / COLLATION(str):字串的字元集與排序規則
- LAST_INSERT_ID():最後一次自動遞增的 ID 值
六、加密函數
保護敏感資料(如密碼)的核心手段,MySQL 提供多種加密演算法。
- PASSWORD(str):MySQL 內部使用的單向加密(已棄用於新版本)
- MD5(str):MD5 雜湊,回傳 32 位十六進位字串
- ENCODE(str, pwd) / DECODE(crypt, pwd):對稱加密/解密,需使用 BLOB 欄位儲存
建議:現代應用應在應用層使用 bcrypt、Argon2 等強雜湊演算法,資料庫層僅儲存雜湊值。
七、其他實用函數
1. 格式化函數
FORMAT(x, n):將數字 x 格式化為保留 n 位小數(四捨五入),並加上千分位逗號。SELECT FORMAT(235.3456, 3); -- 235.346
2. 進制轉換
- BIN(x) / OCT(x) / HEX(x):二進位/八進位/十六進位表示
- CONV(x, f1, f2):將 x 從 f1 進制轉換為 f2 進制
3. IP 地址轉換
- INET_ATON('ip'):IPv4 字串轉無號整數
- INET_NTOA(num):無號整數轉 IPv4 字串
4. 鎖機制
- GET_LOCK(name, timeout):取得具名鎖
- RELEASE_LOCK(name):釋放具名鎖
- IS_FREE_LOCK(name):檢查鎖是否空閒
5. 效能測試
BENCHMARK(count, expr):重複執行 expr count 次,回傳耗時(秒)。
6. 型別轉換
- CAST(x AS type) / CONVERT(x, type):支援 BINARY, CHAR, DATE, DATETIME, TIME, SIGNED/UNSIGNED INTEGER
- CONVERT(s USING charset):字元集轉換