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
| Excel | SQL |
|---|---|
| AutoFilter theo giá trị | WHERE cot = 'giá trị' |
| AutoFilter theo danh sách | WHERE cot IN (...) |
| Lọc số lớn hơn/nhỏ hơn | WHERE cot > 100 |
| Lọc khoảng ngày | WHERE ngay BETWEEN '2025-01-01' AND '2025-12-31' |
| Lọc chứa chuỗi | WHERE cot LIKE '%abc%' |
| Lọc ô trống | WHERE cot IS NULL |
| Sort A→Z | ORDER BY cot ASC |
| Sort nhiều cấp | ORDER BY a ASC, b DESC |
| Top 10 | ORDER 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
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,BETWEENbỏ 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/ORcầ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
-- 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
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õ:
ORDER BY c.email ASC NULLS FIRST;Top N
Excel có bộ lọc "Top 10". SQL:
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:
ORDER BY doanh_thu DESC, p.name ASCLọ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:
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
- Lọc đơn
completedtrong năm 2025 bằng khoảng ngày nửa mở. - Lọc khách ở ba thành phố bằng
IN. - Tìm sản phẩm có tên chứa "Áo" bằng
LIKE. - Sắp xếp khách theo thành phố tăng dần, ngày đăng ký giảm dần.
- 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ứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Mất bản ghi ngày cuối | BETWEEN với cột timestamp | Dùng >= và < ngày kế tiếp |
OR lọc sai | Thiếu ngoặc | Bọc nhóm điều kiện OR |
| Top N thay đổi mỗi lần | Không có ORDER BY | Thêm sắp xếp tất định |
| Không tìm thấy dù có dữ liệu | Khác hoa thường/dấu | Dùng ILIKE, chuẩn hoá dữ liệu |
| Ô trống không lọc được | Dùng = '' thay IS NULL | Dùng IS NULL |
| Kết quả trùng | Thiếu DISTINCT hoặc JOIN nhân dòng | Kiểm tra hạt dữ liệu |
| Lọc sau tổng hợp bị lỗi | Dùng WHERE cho hàm tổng | Dù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
ANDvớiOR. ORDER BYcần tiêu chí phụ để kết quả tất định.- Lọc dòng bằng
WHERE, lọc nhóm bằngHAVING.
Dùng ← → để chuyển bài