SQL 不只是處理文字跟表格啦。在真實的資料庫裡,常常要處理 價格、數量、分數、百分比、座標,也就是 數字。想像一下:
- 你要計算 折扣,想把金額四捨五入到整數。
- 你想 查詢偶數/奇數學生 的資料。
- 你在做 成績 分析,想知道變異數的平方根。
- 或者你要寫 分數計算公式,需要用到次方。
SQL 可以直接搞定這些,不用靠外部程式語言——這些都能用內建的 數學函式 在查詢裡完成。今天我們要聊六個超實用的:
ROUND()— 四捨五入CEIL()— 無條件進位FLOOR()— 無條件捨去MOD()— 取餘數POWER()— 次方SQRT()— 平方根
* 四捨五入數字:ROUND()、CEIL()、FLOOR()*
處理小數(像 4.67891)時,常常要四捨五入。比如你算平均分、訂單總價、折扣百分比等等,多餘的小數位不只「不好看」,還可能讓人搞混。
ROUND() — 按數學規則四捨五入
ROUND(number [, digits])
number— 要四捨五入的數字。digits(可選)— 小數點後要留幾位。
範例:
SELECT ROUND(4.67); -- 5
SELECT ROUND(4.6789, 2); -- 4.68
ROUND() 跟你數學課學的一樣:4.5 → 5,4.49 → 4。
超適合處理金額或分數,要顯示得漂亮:4.33333 → 4.33。
CEIL() — 無條件進位 到最近的整數
SELECT CEIL(4.1); -- 5
- 如果已經是整數,結果不變。
- 永遠回傳 不小於原本數字 的整數。
很適合算頁數,比如 21 個商品每頁 10 個 → 需要 3 頁。
FLOOR() — 無條件捨去
SELECT FLOOR(4.9); -- 4
- 回傳 不大於原本數字 的整數。
用來判斷「樓層」或「階梯」也很方便。
比較一下:
| 數值 | ROUND() | CEIL() | FLOOR() |
|---|---|---|---|
| 4.4 | 4 | 5 | 4 |
| 4.6 | 5 | 5 | 4 |
| -4.6 | -5 | -4 | -5 |
* 取餘數:MOD()*
為什麼要取餘數?比如:
- 檢查一個數是不是偶數。
- 把資料分組(像分成 3 隊)。
- 做循環(像「每第 5 筆資料」)。
語法:
MOD(dividend, divisor)
範例:
SELECT MOD(17, 5); -- 2 (3*5 +2)
SELECT MOD(10, 3); -- 1 (3*3 +1)
注意:餘數的正負跟第一個參數(dividend)有關。
應用:
SELECT student_id,
CASE WHEN MOD(student_id, 2) = 0 THEN '偶數' ELSE '奇數' END AS parity
FROM students;
* 次方:POWER()*
有時候不只是要乘法,而是要用 數學公式:
- 算利息:
base * POWER(1 + rate, years) - 圓面積:
π * r^2 - 機器學習裡的公式加權
語法:
POWER(base, exponent)
範例:
SELECT POWER(2, 3); -- 8
SELECT POWER(5, 2); -- 25
SELECT POWER(9, 0.5); -- 3 (平方根)
這個函式可以吃任何數字:整數、小數、負數都行。
平方根:SQRT()
要算平方根,特別是統計時(像標準差),SQRT() 很好用。
SELECT SQRT(25); -- 5
SELECT SQRT(2); -- ~1.4142
如果你給負數會出錯。如果有這種可能,記得用 ABS():
SELECT SQRT(ABS(-25)); -- 5
實用情境
情境 1:四捨五入訂單總金額
SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;
情境 2:計算需要幾頁
SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;
情境 3:把學生分成 3 組
SELECT student_id,
MOD(student_id, 3) AS group_number
FROM students;
情境 4:平均平方根
SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;
常見錯誤與小提醒
ROUND() 可以吃第二個參數——要四捨五入到小數點後幾位別忘了加。
MOD() 處理負數時可能會有意外結果。
POWER() 跟 SQRT() 都能處理小數參數——需要的話可以用 CAST()。
記得 SQRT() 裡不要塞負數,不然會噴錯。
GO TO FULL VERSION