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ênFLOOR()— làm tròn xuốngMOD()— chia lấy dưPOWER()— lũy thừaSQRT()— 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.33333 → 4.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() và 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.
GO TO FULL VERSION