DHDataHọc
TheoryLesson 3/84 min read+10 XP

Lọc và sắp xếp

Bạn sẽ học được

  • Ánh xạ AutoFilter sang WHERE.
  • Cách sắp xếp nhiều cấp và xử lý NULL.
  • Lấy "Top N" như bộ lọc số của Excel.
  • Lọc theo khoảng ngày và danh sách giá trị.
  • Những khác biệt khiến bộ lọc SQL ổn định hơn.

Khái niệm cốt lõi

ExcelSQL
AutoFilter theo giá trịWHERE cot = 'giá trị'
AutoFilter theo danh sáchWHERE cot IN (...)
Lọc số lớn hơn/nhỏ hơnWHERE cot > 100
Lọc khoảng ngàyWHERE ngay BETWEEN '2025-01-01' AND '2025-12-31'
Lọc chứa chuỗiWHERE cot LIKE '%abc%'
Lọc ô trốngWHERE cot IS NULL
Sort A→ZORDER BY cot ASC
Sort nhiều cấpORDER BY a ASC, b DESC
Top 10ORDER BY cot DESC LIMIT 10

Khác biệt lớn: AutoFilter chỉ ẩn dòng, dữ liệu gốc vẫn còn; SQL trả về tập kết quả mới. Vì vậy SQL có thể lọc trước khi tổng hợp — điều Excel làm được nhưng dễ sai khi quên làm mới PivotTable.

Lọc theo điều kiện

code
SELECT id, order_date, status
FROM orders
WHERE status = 'completed'
  AND order_date >= DATE '2025-01-01'
  AND order_date < DATE '2026-01-01'
ORDER BY order_date DESC;

Ba điểm cần chú ý:

  • Dùng >= và < cho khoảng ngày thay vì BETWEEN '2025-01-01' AND '2025-12-31'. Nếu cột là timestamp, BETWEEN bỏ sót các bản ghi trong ngày cuối sau 00:00.
  • Chuỗi so sánh phải khớp hoa thường trong nhiều database ('Completed' khác 'completed'). Chuẩn hoá dữ liệu đầu vào.
  • AND/OR cần ngoặc khi trộn: WHERE status = 'completed' AND (city = 'Hà Nội' OR city = 'Đà Nẵng').

Lọc theo danh sách và mẫu

code
-- Danh sách giá trị
SELECT * FROM customers WHERE city IN ('Hà Nội', 'Đà Nẵng', 'Cần Thơ');

-- Mẫu chuỗi: bắt đầu bằng "Áo"
SELECT * FROM products WHERE name LIKE 'Áo%';

-- Mẫu chuỗi: chứa "SQL"
SELECT * FROM products WHERE name ILIKE '%sql%';

LIKE phân biệt hoa thường ở PostgreSQL; ILIKE thì không. Với dữ liệu tiếng Việt, ILIKE không xử lý dấu — muốn tìm không dấu cần chuẩn hoá trước hoặc dùng extension.

IN với danh sách dài nên đặt trong bảng tạm hoặc dùng JOIN với bảng danh mục, thay vì viết hàng trăm giá trị.

Sắp xếp nhiều cấp

code
SELECT c.city, c.name, c.signup_date
FROM customers c
ORDER BY c.city ASC, c.signup_date DESC;

Thứ tự sắp xếp quan trọng: city trước, trong mỗi thành phố mới sắp theo ngày. Nếu đảo lại, kết quả là danh sách theo ngày rồi mới theo thành phố.

NULL trong ORDER BY: PostgreSQL mặc định NULLS LAST khi ASC và NULLS FIRST khi DESC. Muốn kiểm soát rõ:

code
ORDER BY c.email ASC NULLS FIRST;

Top N

Excel có bộ lọc "Top 10". SQL:

code
SELECT p.name,
       SUM(oi.quantity * oi.unit_price) AS doanh_thu
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.name
ORDER BY doanh_thu DESC
LIMIT 10;

Lưu ý: LIMIT 10 sau ORDER BY mới đúng là top 10. Nếu đặt LIMIT mà không sắp xếp, database trả 10 dòng bất kỳ — kết quả không ổn định giữa các lần chạy.

Khi có hòa, cần tiêu chí phụ để kết quả tất định:

code
ORDER BY doanh_thu DESC, p.name ASC

Lọc trước khi tổng hợp

Thứ tự thực thi giúp hiểu vì sao bộ lọc đặt đúng chỗ quan trọng:

code
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  • Muốn loại đơn huỷ khỏi doanh thu: WHERE status = 'completed'.
  • Muốn chỉ giữ thành phố có doanh thu lớn: HAVING SUM(...) > ....
  • Muốn chỉ hiện 5 thành phố đầu: ORDER BY ... LIMIT 5.

Đặt sai chỗ là nguyên nhân phổ biến của báo cáo lệch.

Thực hành

  1. Lọc đơn completed trong năm 2025 bằng khoảng ngày nửa mở.
  2. Lọc khách ở ba thành phố bằng IN.
  3. Tìm sản phẩm có tên chứa "Áo" bằng LIKE.
  4. Sắp xếp khách theo thành phố tăng dần, ngày đăng ký giảm dần.
  5. Lấy top 5 sản phẩm theo doanh thu, kèm tiêu chí phụ khi hòa.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Mất bản ghi ngày cuốiBETWEEN với cột timestampDùng >= và < ngày kế tiếp
OR lọc saiThiếu ngoặcBọc nhóm điều kiện OR
Top N thay đổi mỗi lầnKhông có ORDER BYThêm sắp xếp tất định
Không tìm thấy dù có dữ liệuKhác hoa thường/dấuDùng ILIKE, chuẩn hoá dữ liệu
Ô trống không lọc đượcDùng = '' thay IS NULLDùng IS NULL
Kết quả trùngThiếu DISTINCT hoặc JOIN nhân dòngKiểm tra hạt dữ liệu
Lọc sau tổng hợp bị lỗiDùng WHERE cho hàm tổngDùng HAVING

Tóm tắt

  • AutoFilter → WHERE; Sort → ORDER BY; Top N → ORDER BY ... LIMIT.
  • Khoảng ngày dùng >= và < để không bỏ sót ngày cuối.
  • Ngoặc rõ ràng khi trộn AND với OR.
  • ORDER BY cần tiêu chí phụ để kết quả tất định.
  • Lọc dòng bằng WHERE, lọc nhóm bằng HAVING.

Use ← → to move between lessons