首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 數學函數完整速查手冊:從基礎運算到三角函數

     編輯:MySQL 綜合教學

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.3811.4011.30
1.9922.0011.90
232.38232232.4230232232.3230
-1.14-1-1.10-1-1.10
-1.99-2-2.00-1-1.90

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) → NULLWHERE 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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved