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.

🧠 Quiz

Câu 1: Tại sao WHERE salary = NULL không hoạt động?

  • [ ] A) NULL không phải kiểu dữ liệu hợp lệ
  • [x] B) NULL đại diện cho "không xác định", phải dùng IS NULL thay vì =
  • [ ] C) Cần dùng WHERE salary EQUALS NULL
  • [ ] D) NULL chỉ dùng được với SELECT, không dùng với WHERE

💡 Giải thích: Trong SQL, NULL nghĩa là "không xác định". Một giá trị không xác định không thể bằng một giá trị không xác định khác (NULL = NULL trả về NULL, không phải TRUE). Phải dùng IS NULL hoặc IS NOT NULL.

Câu 2: WHERE name LIKE '%son' sẽ match với giá trị nào?

  • [ ] A) son_of_god
  • [ ] B) sonic
  • [x] C) johnson
  • [ ] D) sonata

💡 Giải thích: Pattern '%son' match chuỗi kết thúc bằng "son". % đại diện cho 0 hoặc nhiều ký tự bất kỳ ở đầu. Chỉ johnson kết thúc bằng "son".

Câu 3: Câu nào tương đương với WHERE age IN (20, 25, 30)?

  • [ ] A) WHERE age BETWEEN 20 AND 30
  • [x] B) WHERE age = 20 OR age = 25 OR age = 30
  • [ ] C) WHERE age >= 20 AND age <= 30
  • [ ] D) WHERE age LIKE '2%'

💡 Giải thích: IN (20, 25, 30) kiểm tra giá trị có nằm trong danh sách hay không — tương đương chuỗi OR. BETWEEN 20 AND 30 sẽ bao gồm cả 21, 22... nên không tương đương.