MySQL 內建豐富的數學函數,支援科學計算、財務分析、統計聚合、地理空間計算等場景。本文系統整理所有數學函數,附帶參數說明、返回值特性、實戰示例與陷阱提示,作為開發調試時的桌面速查手冊。
函數分類總覽
| 分類 | 函數列表 |
| 絕對值/符號 | ABS, SIGN |
| 圓周率 | PI |
| 平方根/冪/對數/指數 | SQRT, POW/POWER, EXP, LOG, LOG10, LOG2 |
| 取整/取模/四捨五入/截斷 | CEIL/CEILING, FLOOR, MOD, ROUND, TRUNCATE |
| 隨機數 | RAND |
| 角度/弧度轉換 | RADIANS, DEGREES |
| 三角函數/反三角函數 | SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2, COT |
| 雙曲函數 (8.0+) | SINH, COSH, TANH, ASINH, ACOSH, ATANH |
| 其他 | CRC32, GREATEST, LEAST |
詳細函數參考
1. 基礎運算
ABS(x) -- 絕對值,返回類型同輸入
SIGN(x) -- 符號:負數 -1,零 0,正數 1
PI() -- 圓周率 3.141592653589793
2. 平方根、冪、對數、指數
SQRT(x) -- 平方根,x < 0 返回 NULL
POW(x,y), POWER(x,y) -- x 的 y 次冪
EXP(x) -- e 的 x 次冪 (e=2.71828...)
LN(x), LOG(x) -- 自然對數 (底數 e),x <= 0 返回 NULL
LOG10(x) -- 常用對數 (底數 10)
LOG2(x) -- 二進制對數 (底數 2)
LOG(b, x) -- 底數 b 的對數 (MySQL 特有語法)
3. 取整、取模、四捨五入、截斷
CEIL(x), CEILING(x) -- 向上取整:≥x 的最小整數,返回 BIGINT
FLOOR(x) -- 向下取整:≤x 的最大整數,返回 BIGINT
MOD(N, M), N % M -- 取模:N - M * FLOOR(N/M),支援小數
ROUND(x, d) -- 四捨五入保留 d 位小數,d 可負 (向左取整)
TRUNCATE(x, d) -- 截斷保留 d 位小數,不四捨五入,d 可負
| 輸入 | ROUND(x,0) | ROUND(x,1) | ROUND(x,-1) | TRUNCATE(x,0) | TRUNCATE(x,1) | TRUNCATE(x,-1) |
| 1.38 | 1 | 1.4 | 0 | 1 | 1.3 | 0 |
| 1.99 | 2 | 2.0 | 0 | 1 | 1.9 | 0 |
| 232.38 | 232 | 232.4 | 230 | 232 | 232.3 | 230 |
| -1.14 | -1 | -1.1 | 0 | -1 | -1.1 | 0 |
| -1.99 | -2 | -2.0 | 0 | -1 | -1.9 | 0 |
4. 隨機數
RAND() -- 0~1 間均勻分佈隨機浮點數
RAND(N) -- 種子 N 產生可重複序列,同種子同序列
-- 應用:隨機抽樣、打亂順序
SELECT * FROM users ORDER BY RAND() LIMIT 10;
SELECT * FROM users WHERE RAND() < 0.01; -- 1% 伯努利抽樣
5. 角度/弧度轉換
RADIANS(x) -- 角度轉弧度:x * PI() / 180
DEGREES(x) -- 弧度轉角度:x * 180 / PI()
-- 示例
SELECT RADIANS(90), DEGREES(PI()), DEGREES(PI()/2);
-- 1.570796, 180, 90
6. 三角函數 (參數/返回值均為弧度)
SIN(x) -- 正弦
COS(x) -- 餘弦
TAN(x) -- 正切
ASIN(x) -- 反正弦,定義域 [-1,1],返回 [-PI/2, PI/2]
ACOS(x) -- 反餘弦,定義域 [-1,1],返回 [0, PI]
ATAN(x) -- 反正切,返回 (-PI/2, PI/2)
ATAN2(y,x) -- 反正切 y/x,利用符號確定象限,返回 (-PI, PI]
COT(x) -- 餘切 = 1/TAN(x)
7. 雙曲函數 (MySQL 8.0+)
SINH(x) -- 雙曲正弦
COSH(x) -- 雙曲餘弦
TANH(x) -- 雙曲正切
ASINH(x) -- 反雙曲正弦
ACOSH(x) -- 反雙曲餘弦 (x >= 1)
ATANH(x) -- 反雙曲正切 (|x| < 1)
8. 實用工具函數
CRC32(str) -- 計算字串 CRC32 校驗值,返回無符號整數
GREATEST(x,y,...) -- 返回最大值,任一參數 NULL 則返回 NULL
LEAST(x,y,...) -- 返回最小值,任一參數 NULL 則返回 NULL
實戰應用模式
分頁偏移量計算
-- 第 page 頁,每頁 size 條
SET @offset = (page - 1) * size;
SET @limit = size;
PREPARE stmt FROM 'SELECT * FROM articles ORDER BY created_at DESC LIMIT ?, ?';
EXECUTE stmt USING @offset, @limit;
經緯度距離計算 (Haversine 公式)
-- 輸入:lat1, lon1, lat2, lon2 (角度)
-- 返回:距離 (公里)
SET @R = 6371; -- 地球半徑 km
SET @dLat = RADIANS(lat2 - lat1);
SET @dLon = RADIANS(lon2 - lon1);
SET @a = SIN(@dLat/2) * SIN(@dLat/2) +
COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
SIN(@dLon/2) * SIN(@dLon/2);
SET @c = 2 * ATAN2(SQRT(@a), SQRT(1-@a));
SELECT @R * @c AS distance_km;
財務計算:複利、年化收益
-- 本金 P,年利率 r,n 年,按年複利
SELECT P * POWER(1 + r, n) AS future_value;
-- 連續複利
SELECT P * EXP(r * n) AS future_value;
-- 年化收益率 (CAGR)
SELECT POWER(ending_value / beginning_value, 1/years) - 1 AS cagr;
統計聚合:中位數近似 (MySQL 8.0 無原生 MEDIAN)
-- 近似中位數:PERCENTILE_CONT(0.5) 在 8.0 為窗口函數
-- 簡易近似:取中間位置
SELECT AVG(val) AS median FROM (
SELECT val FROM measurements ORDER BY val
LIMIT 2 OFFSET (SELECT FLOOR(COUNT(*)/2) FROM measurements)
) t;
常見陷阱與最佳實踐
| 陷阱 | 示例 | 正確做法 |
| 整數除法截斷 | SELECT 5/2 → 2 (整數) | SELECT 5/2.0 或 5*1.0/2 → 2.5 |
| MOD 負數行為 | MOD(-7, 3) → -1 (MySQL 保留被除數符號) | 需正數結果:(MOD(x,y)+y)%y |
| ROUND 銀行家捨入 | ROUND(1.5) → 2, ROUND(2.5) → 2 (偶數優先) | 財務四捨五入:使用 TRUNCATE(x*100+0.5)/100 |
| LOG 定義域 | LOG(0) → NULL, LOG(-1) → NULL | WHERE x > 0 過濾或 COALESCE(LOG(x), 0) |
| RAND() 每行重算 | WHERE RAND() < 0.1 不穩定 | 用固定種子或應用層抽樣 |
| 浮點數精度 | 0.1 + 0.2 = 0.30000000000000004 | 金額用 DECIMAL(19,4),比較用 ABS(a-b) < 0.0001 |
版本差異提示
- MySQL 5.7:核心函數完整,無雙曲函數、無窗口函數統計
- MySQL 8.0:新增雙曲函數、
LOG2、ATAN2 更精確、支援 CTE/窗口函數進階統計
- MariaDB 10.3+:
ROUND 行為可通過 sql_mode=ROUND_HALF_UP 改為傳統四捨五入
速查卡片:常用組合
-- 保留 2 位小數四捨五入
ROUND(price, 2)
-- 向上取整到百位
CEILING(amount / 100) * 100
-- 判斷奇偶
MOD(id, 2) = 1 -- 奇數
-- 百分比計算 (避免整數除法)
ROUND(100.0 * success / total, 2)
-- 隨機打亂
ORDER BY RAND(seed)
-- 安全取對數
COALESCE(LOG(NULLIF(x, 0)), 0)