CodeGym /課程 /SQL SELF /SQL 數值函式:四捨五入、取餘數、次方與平方根

SQL 數值函式:四捨五入、取餘數、次方與平方根

SQL SELF
等級 8 , 課堂 3
開放

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.333334.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() 裡不要塞負數,不然會噴錯。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION