CodeGym /Các khóa học /SQL SELF /Hàm số học trong SQL: làm tròn, chia lấy dư, lũy thừa và ...

Hàm số học trong SQL: làm tròn, chia lấy dư, lũy thừa và căn bậc hai

SQL SELF
Mức độ , Bài học
Có sẵn

SQL không chỉ là text với bảng đâu nhé. Trong database thực tế, tụi mình hay phải xử lý giá, số lượng, điểm, phần trăm, tọa độ, nói chung là số. Thử tưởng tượng nè:

  • Bạn tính giảm giá và muốn làm tròn tổng tiền cho đẹp.
  • Bạn muốn hiển thị dữ liệu cho sinh viên chẵn/lẻ.
  • Bạn phân tích điểm số và muốn biết căn bậc hai của phương sai.
  • Hoặc bạn xây công thức tính điểm có lũy thừa.

SQL cân được hết mấy vụ này mà không cần ngôn ngữ lập trình ngoài — làm trực tiếp trong truy vấn nhờ các hàm toán học tích hợp sẵn. Hôm nay mình sẽ chỉ cho bạn 6 hàm hay dùng nhất:

  • ROUND() — làm tròn số
  • CEIL() — làm tròn lên
  • FLOOR() — làm tròn xuống
  • MOD() — chia lấy dư
  • POWER() — lũy thừa
  • SQRT() — căn bậc hai

* Làm tròn số: ROUND(), CEIL(), FLOOR()*

Nhiều khi xử lý số thập phân (ví dụ 4.67891) bạn sẽ cần làm tròn kết quả. Ví dụ, khi tính điểm trung bình, tổng tiền đơn hàng, phần trăm giảm giá v.v., — dư số sau dấu phẩy vừa xấu vừa dễ gây hiểu nhầm.

ROUND() — làm tròn theo toán học

ROUND(number [, digits])
  • number — số cần làm tròn.
  • digits (không bắt buộc) — giữ lại bao nhiêu số sau dấu phẩy.

Ví dụ:

SELECT ROUND(4.67);       -- 5
SELECT ROUND(4.6789, 2);  -- 4.68

ROUND() hoạt động giống làm tròn toán học bình thường: 4.5 → 5, 4.49 → 4.

Rất tiện nếu bạn làm việc với tiền hoặc điểm cần hiển thị đẹp: 4.333334.33.

CEIL() — làm tròn lên tới số nguyên gần nhất

SELECT CEIL(4.1);  -- 5
  • Nếu số đã nguyên thì giữ nguyên.
  • Luôn trả về số nguyên, không nhỏ hơn số gốc.

Ví dụ, bạn cần tính số trang để hiển thị sản phẩm: 21 sản phẩm, mỗi trang 10 sản phẩm → cần 3 trang.

FLOOR() — làm tròn xuống

SELECT FLOOR(4.9);  -- 4
  • Trả về số nguyên không lớn hơn số gốc.

Dùng khi bạn muốn xác định "tầng" hoặc "bậc" mà giá trị đang nằm.

So sánh:

Giá trị ROUND() CEIL() FLOOR()
4.4 4 5 4
4.6 5 5 4
-4.6 -5 -4 -5

* Chia lấy dư: MOD()*

Lấy dư để làm gì? Ví dụ:

  • Kiểm tra số có chẵn không.
  • Chia dòng thành nhóm theo mẫu (ví dụ chia thành 3 đội).
  • Làm vòng lặp lặp lại (kiểu "mỗi bản ghi thứ năm").

Cú pháp:

MOD(dividend, divisor)

Ví dụ:

SELECT MOD(17, 5);  -- 2  (3*5 +2)
SELECT MOD(10, 3);  -- 1  (3*3 +1)

Lưu ý: dấu của phần dư phụ thuộc vào dấu của tham số đầu tiên (dividend).

Ứng dụng:

SELECT student_id,
       CASE WHEN MOD(student_id, 2) = 0 THEN 'Chẵn' ELSE 'Lẻ' END AS parity
FROM students;

* Lũy thừa: POWER()*

Đôi khi bạn không chỉ nhân mà còn phải dùng công thức toán học:

  • Tính phần trăm: base * POWER(1 + rate, years)
  • Diện tích hình tròn: π * r^2
  • Trọng số công thức trong machine learning

Cú pháp:

POWER(base, exponent)

Ví dụ:

SELECT POWER(2, 3);   -- 8
SELECT POWER(5, 2);   -- 25
SELECT POWER(9, 0.5); -- 3 (căn bậc hai)

Hàm này nhận mọi loại số: nguyên, thập phân, âm đều được.

Căn bậc hai: SQRT()

Nếu bạn cần tính căn, nhất là trong thống kê (ví dụ độ lệch chuẩn), SQRT() sẽ rất hữu ích.

SELECT SQRT(25);    -- 5
SELECT SQRT(2);     -- ~1.4142

Nếu truyền số âm — sẽ bị lỗi. Nếu dữ liệu có thể âm, hãy dùng ABS():

SELECT SQRT(ABS(-25));  -- 5

Tình huống thực tế

Tình huống 1: làm tròn tổng tiền đơn hàng

SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;

Tình huống 2: tính số trang cần hiển thị

SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;

Tình huống 3: chia sinh viên thành 3 nhóm

SELECT student_id,
       MOD(student_id, 3) AS group_number
FROM students;

Tình huống 4: căn bậc hai của trung bình bình phương

SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;

Lỗi thường gặp và tips

ROUND() có thể nhận tham số thứ hai — nhớ dùng nếu muốn làm tròn tới phần trăm.

MOD() với số âm có thể trả kết quả bất ngờ.

POWER()SQRT() dùng được với số thập phân — cần thì dùng CAST().

Nhớ kiểm tra SQRT() không nhận số âm, không thì sẽ lỗi runtime.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION