Câu 1Trong những đáp án sau, đâu là kết quả đúng của SELECT ROUND(3.84);?
Hàm ③ — Hàm toán học (ROUND / FLOOR / CEILING) và COALESCE
Bài thứ ba trong ba bài về hàm SQL. Bao gồm các hàm toán học ROUND / FLOOR / CEILING / POWER và COALESCE — trả về giá trị không-NULL đầu tiên — sử dụng tập dữ liệu staff và test-score được tải từ CSV.
Dữ liệu dùng trong bài này — staff và test_score
Bài cuối về hàm bao gồm hàm toán học và COALESCE. Với hàm toán học, chúng ta sẽ xử lý làm tròn, sàn, trần và lũy thừa trên các giá trị số như cột salary. Với COALESCE, chúng ta sẽ bao quát việc thay thế NULL bằng giá trị khác.
Bài này dùng hai CSV. Nửa đầu (hàm toán học) dùng cùng bảng staff như trước (10 nhân viên). Nửa sau (COALESCE) đưa vào bảng mới test_score (8 sinh viên × 3 lần thi, có NULL). Trong test_score, các cột score_1 / score_2 / score_3 có NULL ở nơi sinh viên vắng mặt và không làm bài đó — hoàn hảo cho kịch bản thực tế như «dùng điểm của bài thi đầu tiên mà sinh viên có thể làm» để học cách COALESCE hoạt động.
Hàm toán học — ROUND / FLOOR / CEILING / POWER
Đây là 4 hàm chính để định dạng các giá trị số:
- ROUND(x, n): làm tròn đến n chữ số thập phân. Bỏ n và nó làm tròn đến số nguyên
- FLOOR(x): sàn (làm tròn về phía vô cùng âm)
- CEILING(x) hoặc CEIL(x): trần (làm tròn về phía vô cùng dương)
- POWER(x, y): lũy thừa (x mũ y)
-- 1) ROUND: làm tròn
SELECT ROUND(3.14); -- 3 (số nguyên)
SELECT ROUND(3.14, 1); -- 3.1 (1 chữ số thập phân)
-- 2) FLOOR: sàn
SELECT FLOOR(3.84); -- 3
-- Lưu ý: CEILING chạy trên MySQL / PostgreSQL / Oracle / SQL Server — SELECT CEILING(3.14); → 4
-- 3) POWER: lũy thừa
SELECT POWER(3, 4); -- 81 (3 mũ 4)
SELECT POWER(2, 10); -- 1024
-- 4) Trên cột — làm tròn lương tháng
SELECT name, salary, ROUND(salary / 12.0) AS monthly
FROM staff;
| Đầu vào | ROUND (làm tròn) | FLOOR (sàn) | CEILING (trần / không có trong console của khóa học này) |
|---|---|---|---|
| 3.14 | 3 | 3 | 4 |
| 3.84 | 4 | 3 | 4 |
| 3.50 | 4 | 3 | 4 |
| -3.14 | -3 | -4 (về phía âm) | -3 |
COALESCE — trả về giá trị không-NULL đầu tiên
`COALESCE(giá_trị1, giá_trị2, giá_trị3, ...)` đánh giá các đối số từ trái sang phải và trả về cái đầu tiên không phải NULL. Nếu tất cả đều NULL, nó trả về NULL. Dùng nó bất cứ khi nào bạn muốn dự phòng cho NULL: «dùng cột chính nếu có giá trị, nếu không thì cột dự phòng, nếu không thì giá trị mặc định».
Bài này dùng bảng test_score. Đối với mỗi student_id, score_1 / score_2 / score_3 chứa điểm của các bài thi thứ 1, 2, và 3, với NULL ở nơi sinh viên vắng mặt. Truyền (score_1, score_2, score_3, 0) cho COALESCE cho bạn điểm của bài thi đầu tiên mà sinh viên có thể làm, được coi như «điểm cuối cùng». Thêm 0 ở cuối nghĩa là «nếu họ bỏ cả ba, coi là 0».
-- 1) Kiểm tra với giá trị literal
SELECT COALESCE(NULL, NULL, 'C'); -- 'C'
SELECT COALESCE(NULL, NULL, NULL); -- NULL
-- 2) Lấy điểm cuối từ bảng test_score
SELECT student_id, name, score_1, score_2, score_3,
COALESCE(score_1, score_2, score_3) AS first_score
FROM test_score;
-- 3) Dùng giá trị mặc định — «vắng mặt tất cả = 0 điểm»
SELECT student_id, name,
COALESCE(score_1, score_2, score_3, 0) AS final_score
FROM test_score;
Phiên bản 2 đối số có thể viết là IFNULL
Đối với trường hợp đơn giản 2 đối số — «nếu NULL, dùng giá trị mặc định; nếu không, giá trị gốc» — bạn cũng có thể viết IFNULL(cột, default) (được hỗ trợ cả trong console của khóa học này và MySQL). COALESCE(email, 'chưa đăng ký') và IFNULL(email, 'chưa đăng ký') là chính xác cùng một thứ.
Khi bạn cần 3 đối số trở lên, dùng COALESCE. Vì COALESCE là chuẩn SQL, cùng dạng hoạt động trên PostgreSQL, Oracle, SQL Server, v.v. — đó là lựa chọn di động hơn.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2SELECT FLOOR(3.84), CEILING(3.14); trả về gì?
Câu 3SELECT COALESCE(NULL, NULL, 'C', 'D'); trả về gì?