Skip to content

WHERE: Lọc dữ liệu

Trong thực tế, bạn hiếm khi lấy toàn bộ dữ liệu. WHERE giúp bạn lọc ra chính xác những dòng (rows) thỏa mãn điều kiện cụ thể.

Cú pháp (Syntax)

sql
SELECT columns
FROM table_name
WHERE condition;

Các toán tử phổ biến (Operators)

Toán tửMô tảVí dụ
=BằngWHERE status = 'active'
<> hoặc !=KhácWHERE role <> 'admin'
INNằm trong danh sáchWHERE id IN (1, 2, 3)
BETWEENNằm trong khoảngWHERE age BETWEEN 18 AND 30
IS NULLKiểm tra giá trị NULLWHERE phone_number IS NULL
LIKESo sánh mẫu (Pattern)WHERE name LIKE 'Nguyen%'

Ví dụ thực tế (Real-world Example)

Tìm tất cả đơn hàng đã hoàn thành (completed) và có giá trị lớn hơn 500k.

sql
SELECT id, user_id, total_amount
FROM orders
WHERE status = 'completed' AND total_amount > 500000;

💡 HPN Pro Tip: Cẩn thận với LIKE và Index

Một trong những lý do khiến hệ thống tìm kiếm chậm như rùa bò là lạm dụng LIKE.

  • Tốt (Sử dụng được Index): LIKE 'keyword%'

    • Ví dụ: WHERE name LIKE 'Nguyen%' (Tìm họ Nguyễn).
    • Database biết bắt đầu bằng 'Nguyen', nó có thể nhảy ngay đến vùng dữ liệu đó trong Index B-Tree.
  • Thảm họa (Không dùng được Index): LIKE '%keyword%'

    • Ví dụ: WHERE name LIKE '%Van%' (Tìm tên lót Văn).
    • Database buộc phải quét toàn bộ bảng (Full Table Scan) vì chuỗi 'Van' có thể nằm ở bất cứ đâu. Với bảng vài triệu dòng, truy vấn này sẽ treo server.

Giải pháp: Nếu cần tìm kiếm văn bản phức tạp (Full-text Search), hãy dùng Elasticsearch hoặc tính năng Full-Text Search chuyên dụng của Database (như tsvector trong Postgres), đừng dùng LIKE.

⚠️ Common Mistake

Sai lầm phổ biến là so sánh với NULL bằng dấu =.

Sai:

sql
SELECT * FROM users WHERE phone_number = NULL; -- Không trả về  gì cả

Đúng:

sql
SELECT * FROM users WHERE phone_number IS NULL;

Trong SQL, NULL có nghĩa là "không xác định". Một cái gì đó "không xác định" không thể bằng một cái "không xác định" khác.