CodeGym /Các khóa học /SQL SELF /Ví dụ làm việc với NULL trong các bài toán thực tế: tính ...

Ví dụ làm việc với NULL trong các bài toán thực tế: tính toán, lọc, sắp xếp

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

Làm việc với NULL xuất hiện ở rất nhiều tình huống: từ xử lý dữ liệu thiếu trong báo cáo cho đến lọc và sắp xếp. Nếu phải chọn giữa việc không có giá trị trong bảng và một con số kỳ lạ kiểu 9999, đa số sẽ chọn NULL — ừ thì, nó không tiện lắm, nhưng ít ra là thật thà. Cùng xem vài case điển hình nhé.

Ví dụ: sắp xếp sản phẩm với giá bị thiếu

Giả sử bạn đang quản lý một shop online, và bạn có bảng sản phẩm như sau:

product_id name price
1 Điện thoại 45000
2 Laptop NULL
3 Máy ảnh 25000
4 Đồng hồ thông minh NULL

Bạn muốn sắp xếp sản phẩm theo giá, trong đó sản phẩm không có giá (NULL) sẽ nằm ở cuối.

SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;

Kết quả:

product_id name price
3 Máy ảnh 25000
1 Điện thoại 45000
2 Laptop NULL
4 Đồng hồ thông minh NULL

Lưu ý cú pháp quan trọng NULLS LAST. Mặc định PostgreSQL với ASC sẽ để NULL lên đầu, nhưng với tham số này thì nó sẽ nằm cuối.

Ví dụ: lọc sinh viên không có ngày sinh

Bạn có bảng sinh viên và muốn chọn ra những ai chưa có ngày sinh.

student_id name birth_date
1 Otto Art 2000-01-15
2 Anna Song NULL
3 Alex Lin 1999-05-10
4 Maria Chi NULL

Truy vấn:

SELECT student_id, name
FROM students
WHERE birth_date IS NULL;

Kết quả:

student_id name
2 Anna Song
4 Maria Chi

Bạn đã lấy được thông tin sinh viên chưa có ngày sinh.

Ví dụ dùng hàm để xử lý NULL

Ví dụ: tính tổng cuối cùng có xét đến NULL

Bảng đơn hàng lưu số tiền đơn hàng. Nhưng dữ liệu không phải lúc nào cũng đủ, nên cần tính trường hợp số tiền là 0 nếu bị thiếu.

Dữ liệu ví dụ:

order_id customer_name order_amount
1 Alex 1200
2 Maria 2500
3 Max NULL
4 Xena 3100

Truy vấn:

SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;

Kết quả:

total_amount
6800

Bạn dùng COALESCE(order_amount, 0) để thay NULL thành 0 trước khi cộng tổng. Như vậy sẽ tránh lỗi hoặc tính sai.

Ví dụ: hiển thị text thay cho NULL

customer_name order_amount
Alex 1200
Maria 2500
Max NULL
Xena 3100

Trong báo cáo cần hiển thị text "Không có" cho mọi dữ liệu trống thay vì NULL.

SELECT
    customer_name, 
    COALESCE(order_amount::TEXT, 'Không có') AS order_status
FROM orders;

Kết quả:

customer_name order_status
Alex 1200
Maria 2500
Max Không có
Xena 3100

COALESCE() giúp bạn hiển thị text mong muốn nếu giá trị là NULL.

Tình huống phức tạp với NULL

customer_name order_amount
Alex 1200
Maria 2500
Max NULL
Xena 3100

Bài toán là — sắp xếp đơn hàng sao cho đơn hàng không có số tiền nằm đầu, sau đó là giảm dần từ lớn đến nhỏ.

SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;

Kết quả:

customer_name order_amount
Max NULL
Xena 3100
Maria 2500
Alex 1200

Ở đây bạn dùng NULLS FIRST để cho NULL lên trước các giá trị khác.

Ví dụ: lọc dữ liệu và thay thế giá trị NULL

student_id name birth_date
1 Otto Art 2000-01-15
2 Anna Song NULL
3 Alex Lin 1999-05-10
4 Maria Chi NULL

Trong một số báo cáo, bạn cần chỉ hiển thị dòng có giá trị hoặc thay thế bằng "Không rõ" nếu là NULL.

SELECT
    student_id, 
    name, 
    COALESCE(birth_date::TEXT, 'Không rõ') AS birth_date_info
FROM students;

Kết quả:

student_id name birth_date_info
1 Otto Art 2000-01-15
2 Anna Song Không rõ
3 Alex Lin 1999-05-10
4 Maria Chi Không rõ

Cái này cực kỳ hữu ích khi làm báo cáo, vì bạn cần cho thấy dữ liệu bị thiếu.

Mẹo thực tế

Làm việc với NULL cần chú ý kỹ. Đây là vài tip hay ho:

  • Dùng IS NULLCOALESCE() để kiểm tra và thay thế giá trị thiếu.
  • Nhớ là hàm tổng hợp sẽ bỏ qua NULL, trừ COUNT(*).
  • Khi sắp xếp nhớ dùng NULLS FIRSTNULLS LAST.
  • Trong báo cáo nên ghi rõ bạn xử lý NULL thế nào để tránh hiểu nhầm với đồng nghiệp.

Biết mấy cái này không chỉ giúp bạn viết truy vấn đúng mà còn gây ấn tượng khi phỏng vấn nữa. Vì xử lý dữ liệu thực tế luôn được đánh giá cao hơn lý thuyết suông mà!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Lọc các dòng có giá trị NULL
Lọc các dòng có giá trị NULL
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tính tổng doanh số với xử lý NULL
Tính tổng doanh số với xử lý NULL
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION