Học bằng cách đọc theo thứ tự

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ọcCOALESCE. 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.

Trước khi bắt đầu các bài thực hành, hãy kiểm tra định nghĩa cộtdữ liệu mẫu của cả hai bảng — stafftest_score.

① Chạy PRAGMA table_info(staff);PRAGMA table_info(test_score); để xem các cột của cả hai.

② Chạy SELECT * FROM staff LIMIT 5;SELECT * FROM test_score LIMIT 5; để xem trước 5 hàng đầu.

SQL Editor

Chạy truy vấn để xem kết quả

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àoROUND (làm tròn)FLOOR (sàn)CEILING (trần / không có trong console của khóa học này)
3.14334
3.84434
3.50434
-3.14-3-4 (về phía âm)-3

Hãy tưởng tượng một yêu cầu: «chia lương năm cho 12 để có lương tháng, hiển thị dưới dạng số nguyên đã làm tròn». (Nếu bạn chạy đúng, một giải thích sẽ hiện ra.)

① Từ bảng staff, lấy name, salary, và `ROUND(salary / 12.0)` với bí danh `monthly` — tổng 3 cột.

② Sắp xếp theo monthly giảm dần.

③ Kiểm tra kết quả có 10 hàng và bắt đầu với Frank Tanaka 7,200,000 / 600,000.

SQL Editor

Chạy truy vấn để xem kết quả

Hãy tưởng tượng một yêu cầu: «ước tính lương năm 3 năm sau, giả sử tăng 10% mỗi năm». Nhân với cùng một hệ số nhiều lần có thể viết trong một biểu thức với `POWER(x, y)` (x mũ y). Ba lần tăng × 1.1 liên tiếp trở thành salary * POWER(1.1, 3), tương đương salary * 1.331.

① Từ bảng staff, lấy name, salary, và *`ROUND(salary POWER(1.1, 3)) với bí danh salary_after_3y`** — tổng 3 cột (ROUND giữ kết quả ở dạng số nguyên).

② Sắp xếp theo salary_after_3y giảm dần và chỉ giữ 5 hàng đầu.

③ Kiểm tra kết quả là 5 hàng, bắt đầu với Frank Tanaka 7,200,000 / 9,583,200 và David Sato 6,800,000 / 9,050,800 là hàng 2.

SQL Editor

Chạy truy vấn để xem kết quả

Hãy tưởng tượng một yêu cầu: «trong hiển thị lương tháng, kiểm tra cách làm tròn vs. sàn thay đổi kết quả». Đặt 2 hàm làm tròn cạnh nhau trên cùng một biểu thức để thấy sự khác biệt hành vi nhìn lướt qua.

① Từ bảng staff, lấy name, salary, `ROUND(salary / 12.0)` như `round_monthly`, và `FLOOR(salary / 12.0)` như `floor_monthly` — tổng 4 cột.

② Sắp xếp theo salary tăng dần và chỉ giữ 5 hàng đầu.

③ Kiểm tra kết quả là 5 hàng theo thứ tự Emi / Carol / Iris / Alice / Bob. Đối với Alice (có lương chia hết cho 12), round_monthlyfloor_monthly phải bằng nhau; với những người khác chúng phải khác nhau (phần thập phân thay đổi hành vi).

SQL Editor

Chạy truy vấn để xem kết quả

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».

COALESCE hoạt động — trả về cái không-NULL đầu tiên từ trái
Đối sốGiá trị chọnÝ nghĩa(85, 92, 78)85Cái 1 không-NULL,trả về nó(NULL, 78, 88)78Cái 1 NULL,trả về cái 2(NULL, NULL, 95)95Cái 1 & 2 NULL,trả về cái 3(NULL, NULL, NULL)NULLTất cả NULL,trả về NULL
Các đối số được đánh giá từ trái sang phải, và giá trị không-NULL đầu tiên được trả về. Đặt một literal (như 0 hoặc 'unknown') ở cuối để đặt giá trị mặc định.
-- 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ý')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.

Hãy tưởng tượng một yêu cầu: «chúng tôi đã làm 3 bài thi, nhưng có vắng mặt — dùng điểm của bài thi đầu tiên mà mỗi sinh viên có thể làm làm điểm cuối».

① Từ bảng test_score, lấy student_id, name, score_1, score_2, score_3, và `COALESCE(score_1, score_2, score_3)` với bí danh `first_score` — tổng 6 cột.

② Kiểm tra kết quả là 8 hàng: Alice 85 (score_1 không-NULL), Bob 78 (score_1 NULL nên chọn score_2), Carol 95 (score_1 và score_2 NULL nên score_3), Dave NULL (tất cả NULL).

SQL Editor

Chạy truy vấn để xem kết quả

Hãy tưởng tượng một yêu cầu: «cho mọi sinh viên một điểm cuối. Coi các sinh viên liên tục vắng mặt là 0, và trao thưởng top 3 theo điểm cuối».

① Từ bảng test_score, lấy student_id, name, và `COALESCE(score_1, score_2, score_3, 0)` với bí danh `final_score` — tổng 3 cột.

② Sắp xếp theo final_score giảm dần và chỉ giữ 3 hàng đầu.

③ Kiểm tra kết quả là 3 hàng: Carol 95 / Frank 90 / Grace 88.

SQL Editor

Chạy truy vấn để xem kết quả
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Trong những đáp án sau, đâu là kết quả đúng của SELECT ROUND(3.84);?

Câu 2SELECT FLOOR(3.84), CEILING(3.14); trả về gì?

Câu 3SELECT COALESCE(NULL, NULL, 'C', 'D'); trả về gì?