Giao diện
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ằng | WHERE status = 'active' |
<> hoặc != | Khác | WHERE role <> 'admin' |
IN | Nằm trong danh sách | WHERE id IN (1, 2, 3) |
BETWEEN | Nằm trong khoảng | WHERE age BETWEEN 18 AND 30 |
IS NULL | Kiểm tra giá trị NULL | WHERE phone_number IS NULL |
LIKE | So 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.
- Ví dụ:
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.
- Ví dụ:
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.