| 特性 | 函數 (FUNCTION) | 存儲過程 (PROCEDURE) |
|---|---|---|
| 返回值 | 必須 返回單值 (RETURNS) | 無直接返回,通過 OUT 參數多值輸出 |
| 調用方式 | 嵌入 SQL 表達式:SELECT func(...) | 獨立調用:CALL proc(...) |
| 適用場景 | 簡單計算、轉換、格式化 | 複雜業務流程、多表操作、事務控制 |
| 事務支持 | 隱式只讀,不可提交/回滾 | 可顯式事務控制 |
ABS(-5) -- 5
CEIL(3.14) -- 4
FLOOR(3.99) -- 3
ROUND(3.14159, 2) -- 3.14
POW(2, 10) -- 1024
RAND() -- 0~1 隨機數
CONCAT('a','b','c') -- 'abc'
SUBSTRING('hello', 2, 3) -- 'ell'
TRIM(' hi ') -- 'hi'
REPLACE('a_b_c', '_', '-') -- 'a-b-c'
LENGTH('中文') -- 6 (字節)
CHAR_LENGTH('中文') -- 2 (字符)
NOW() -- 當前 datetime
CURDATE() -- 當前 date
CURTIME() -- 當前 time
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
DATEDIFF('2024-12-31', '2024-01-01') -- 365
DATE_ADD(NOW(), INTERVAL 1 DAY)
IF(cond, true_val, false_val)
CASE WHEN cond1 THEN v1 WHEN cond2 THEN v2 ELSE v3 END
COALESCE(NULL, NULL, 'first_non_null') -- 'first_non_null'
NULLIF('same', 'same') -- NULL
DELIMITER ;;
CREATE FUNCTION func_compare (a INT) RETURNS VARCHAR(200) CHARSET utf8
DETERMINISTIC -- 相同輸入必產生相同輸出,優化器可緩存
BEGIN
IF a >= 10 THEN
RETURN '大於等於10';
ELSE
RETURN '小於10';
END IF;
END;;
DELIMITER ;
-- 驗證
SELECT func_compare(9), func_compare(11);
-- 結果: '小於10', '大於等於10'
DETERMINISTIC / NOT DETERMINISTIC:聲明確定性,**必須誠實標註**,否則查詢緩存可能返回錯誤結果READS SQL DATA / MODIFIES SQL DATA / NO SQL:聲明數據訪問類型SQL SECURITY DEFINER | INVOKER:執行權限上下文-- 函數:可直接用於 WHERE/SELECT/ORDER BY
SELECT * FROM orders WHERE func_compare(amount) = '大於等於10';
-- 存儲過程:需 CALL,不可嵌入查詢
CALL proc_order_stats(@total, @avg);
func__ (如 func_util_mask_phone)善用函數封裝通用邏輯,讓 SQL 更簡潔、更可讀、更易維護。