Một cặp ngoặc thiếu làm báo cáo của bạn dư 40% số dòng

Cơ bản 4 phút đọc Cập nhật 30/07/2026 UPA AI Partner

Truy vấn chạy, không báo lỗi, và trả về nhiều hơn đúng 40%. Nguyên nhân nằm ở thứ tự ưu tiên mà không ai dạy bạn.

Bài toán

Bạn cần lấy khách VIP ở Việt Nam hoặc Mỹ. Câu viết ra rất tự nhiên:

SELECT * FROM khach_hang
WHERE quoc_gia = 'VN' OR quoc_gia = 'US' AND vip = 1;

Kết quả trả về cả khách Việt Nam không phải VIP. Không có lỗi cú pháp nào.

✗ Không có ngoặc✓ Có ngoặcidtenquoc_giavip1AnVN12BenUS03ChiVN0Ben lọt vào vì AND chạy trước ORidtenquoc_giavip1AnVN12BenUS03ChiVN0Chỉ An thoả cả hai vế

Lỗi thường gặp

SQL có thứ tự ưu tiên giống toán học: NOT > AND > OR. Máy đọc câu trên thành:

WHERE quoc_gia = 'VN'
   OR (quoc_gia = 'US' AND vip = 1);

Tức là: “mọi khách Việt Nam, cộng thêm khách Mỹ là VIP”. Hoàn toàn khác ý bạn.

Quy tắc sống còn Hễ trong một mệnh đề WHERE có cả AND lẫn OR, luôn đặt ngoặc quanh phần OR. Không có ngoại lệ.

Cách đúng

SELECT * FROM khach_hang
WHERE (quoc_gia = 'VN' OR quoc_gia = 'US')
  AND vip = 1;

Với danh sách dài, IN gọn hơn và ít sai hơn:

WHERE quoc_gia IN ('VN','US','SG','TH')
  AND vip = 1;

Bẫy đi kèm: NOT và NULL

-- Bỏ sót khách có quoc_gia = NULL
WHERE quoc_gia NOT IN ('VN','US')

-- An toàn
WHERE (quoc_gia NOT IN ('VN','US') OR quoc_gia IS NULL)

NULL không bằng và cũng không khác bất cứ giá trị nào, nên nó lặng lẽ rơi khỏi kết quả.

BETWEEN bao gồm cả hai đầu

WHERE tuoi BETWEEN 18 AND 25   -- gồm cả 18 và 25

Với kiểu ngày giờ, đừng dùng BETWEEN. BETWEEN '2026-01-01' AND '2026-01-31' sẽ bỏ sót mọi giao dịch sau 00:00 ngày 31. Dùng >= ngày_đầu AND < ngày_sau.

Luyện tập

  • LeetCode 595 — Big Countries
  • LeetCode 584 — Find Customer Referee (bẫy NULL kinh điển)
  • LeetCode 1148 — Article Views I
  • HackerRank — Weather Observation Station 6 đến 12

Tóm lại

  • AND luôn được tính trước OR.
  • Có cả hai trong một WHERE thì bắt buộc đặt ngoặc.
  • IN thay cho chuỗi OR dài.
  • NOT IN âm thầm bỏ sót dòng có NULL.
  • Không dùng BETWEEN cho ngày giờ.

Bạn vừa học xong AND, OR và dấu ngoặc

Sẵn sàng luyện tập chưa?

Làm bài tập AND, OR và dấu ngoặc trên dữ liệu thật, chấm điểm ngay khi bạn bấm chạy.

Bắt đầu luyện tập →