ABS(x)
SELECT ABS(1), ABS(-1), ABS(0);
-- 1, 1, 0
ABS(-9223372036854775808) 溢出返回負數(符號位無法翻轉),需注意邊界PI()
SELECT PI(); -- 3.141592653589793
DOUBLE 精度常量RADIANS() 轉換SQRT(x)
SELECT SQRT(49), SQRT(0), SQRT(-49);
-- 7, 0, NULL
NULL(不報錯)DOUBLEMOD(x, y) / x % y
SELECT MOD(31,8), MOD(21,-8), MOD(-7,2), MOD(-7,-2), MOD(45.5,6);
-- 7, 5, -1, -1, 3.5
MOD(x,0) 返回 NULLCEIL(x) / CEILING(x)
SELECT CEIL(-3.35), CEIL(3.35), CEILING(-3.35);
-- -3, 4, -3
BIGINT(MySQL 8.0+)或 DECIMALCEIL 和 CEILING 完全等價FLOOR(x)
SELECT FLOOR(-3.35), FLOOR(3.35);
-- -4, 3
FLOOR((offset-1)/page_size)ROUND(x, d)
SELECT ROUND(-1.14), ROUND(-1.9), ROUND(1.14), ROUND(1.9);
-- -1, -2, 1, 2
SELECT ROUND(1.38,1), ROUND(1.38,0), ROUND(232.38,-1), ROUND(232.38,-2);
-- 1.4, 1, 230, 200
d > 0:保留小數點後 d 位d = 0:四捨五入到整數d < 0:從小數點向左 d 位四捨五入(十位、百位)ROUND(x, d, mode),mode=1 為銀行家舍入(偶數優先)TRUNCATE(x, d)
SELECT TRUNCATE(1.33,1), TRUNCATE(1.99,1), TRUNCATE(1.99,0), TRUNCATE(19.99,-1);
-- 1.3, 1.9, 1, 10
d **必須提供**,無默認值SIGN(x)
SELECT SIGN(-21), SIGN(-0), SIGN(0), SIGN(0.0), SIGN(21);
-- -1, 0, 0, 0, 1
CASE SIGN(x) WHEN 1 THEN '正' WHEN -1 THEN '負' ELSE '零' ENDPOW(x, y) / POWER(x, y)
SELECT POW(2,2), POW(2,-2), POW(-2,2), POW(-2,-2);
-- 4, 0.25, 4, 0.25
x ^ y(注意:MySQL 中 ^ 是位異或,非冪運算)DOUBLEEXP(x) = e^x
SELECT EXP(3), EXP(0), EXP(-3);
-- 20.0855, 1, 0.049787
EXP(LOG(x)) = x (x > 0)EXP(709) ≈ 1e308,再大返回 NULL + 警告LOG(x) / LN(x)
SELECT LOG(3), LOG(-3), LOG(0);
-- 1.0986, NULL, NULL
NULLLOG(b, x) 以 b 為底對數(MySQL 8.0+)LOG10(x)
SELECT LOG10(100), LOG10(-100), LOG10(0);
-- 2, NULL, NULL
LOG(10, x)RADIANS(deg) 角度→弧度DEGREES(rad) 弧度→角度
SELECT RADIANS(90), RADIANS(180), DEGREES(PI()), DEGREES(PI()/2);
-- 1.5708, 3.1416, 180, 90
弧度 = 角度 * PI() / 180
SELECT SIN(PI()/2), ASIN(1), ASIN(2);
-- 1, 1.5708, NULL
SIN(x):x 為弧度,返回 [-1, 1]ASIN(x):x 必須在 [-1, 1],否則 NULL
SELECT COS(PI()), ACOS(-1), ACOS(2);
-- -1, 3.1416, NULL
SELECT TAN(PI()/4), ATAN(1), ATAN2(1,1);
-- 1, 0.7854, 0.7854
ATAN2(y, x):返回向量 (x,y) 與 X 軸夾角,**支持象限判斷**,比 ATAN(y/x) 更健壯
SELECT COT(0.5), COT(0);
-- 1.8305, NULL (除零)
COT(x) = 1/TAN(x) = COS(x)/SIN(x)x = k*PI() 時 SIN(x)=0,返回 NULLRAND() 與 RAND(seed)
-- 無種子:每次調用返回不同值
SELECT RAND(), RAND(), RAND();
-- 0.693, 0.515, 0.494
-- 有種子:同種子序列固定,可復現
SELECT RAND(10), RAND(10), RAND(2), RAND(-2);
-- 0.65705, 0.65705, 0.65559, 0.65485
DOUBLEORDER BY RAND() LIMIT 10 隨機抽樣(大表慎用,全表掃描)SELECT 5/2 → 2.5 (MySQL 默認非整數除法);SELECT 5 DIV 2 → 2 (整數除法)SELECT 0.1 + 0.2 = 0.3 → 0 (浮點誤差);用 ROUND(0.1+0.2, 1) = 0.3 或 DECIMAL 類型-7 % 2 = 1)ROUND(1.5)=2, ROUND(-1.5)=-2),非銀行家舍入SIN(90) ≠ 1,SIN(RADIANS(90)) = 1ORDER BY RAND() 會生成臨時表排序,**百萬級表極慢**;改用 WHERE RAND() < 0.01 伯努利採樣或應用層隨機 ID
-- Haversine 公式
SET @lat1 = RADIANS(39.9042); -- 北京
SET @lon1 = RADIANS(116.4074);
SET @lat2 = RADIANS(31.2304); -- 上海
SET @lon2 = RADIANS(121.4737);
SELECT 6371 * 2 * ASIN(SQRT(
POW(SIN((@lat2 - @lat1)/2), 2) +
COS(@lat1) * COS(@lat2) * POW(SIN((@lon2 - @lon1)/2), 2)
)) AS distance_km;
-- 約 1084 km
-- 伯努利採樣:每行獨立以概率 p 選中
SELECT * FROM large_table
WHERE RAND() < 0.001 -- 0.1% 採樣率
LIMIT 100;
-- 系統採樣:按主鍵區間跳躍
SELECT * FROM large_table
WHERE id % 1000 = FLOOR(RAND() * 1000)
LIMIT 100;
-- 錯誤:浮點累積
SELECT SUM(price * quantity) FROM order_items; -- 可能 100.0000000001
-- 正確:轉分計算或 DECIMAL
SELECT TRUNCATE(SUM(ROUND(price * 100) * quantity) / 100, 2) FROM order_items;
-- 或表結構定義:price DECIMAL(10,2)
MySQL 數學函數涵蓋科學計算、財務核算、地理空間、隨機抽樣等全域場景。掌握核心在於:
DECIMAL 存儲金額,DOUBLE 科學計算RAND()、SQRT()、三角函數在大表 WHERE 條件中會導致全表掃描,應在應用層或子查詢預計算善用 TRUNCATE 替代 ROUND 做財務截斷,用 ATAN2 替代 ATAN 做角度計算,用 POW 而非 ^ 做冪運算,這些細節決定計算的正確性與性能。