Khi cần lọc dữ liệu theo nhiều giá trị cụ thể của một cột, hãy dùng toán tử IN thay vì viết nhiều mệnh đề OR.
Cú pháp
SELECT * FROM tên_bảng WHERE tên_cột IN ('giá_trị_1', 'giá_trị_2', 'giá_trị_3', ...);
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE InOperatorDemo (
-> ClientId INT
-> );
Query OK, 0 rows affected (0.52 sec)
Chèn dữ liệu:
mysql> INSERT INTO InOperatorDemo VALUES (101), (110), (120), (230), (270), (300);
Xem dữ liệu:
mysql> SELECT * FROM InOperatorDemo;
+----------+ | ClientId | +----------+ | 101 | | 110 | | 120 | | 230 | | 270 | | 300 | +----------+
Lọc các ClientId = 120, 270, 300:
mysql> SELECT * FROM InOperatorDemo WHERE ClientId IN ('120', '270', '300');
+----------+ | ClientId | +----------+ | 120 | | 270 | | 300 | +----------+
Ưu điểm của IN so với OR
- Ngắn gọn, dễ đọc hơn khi có nhiều giá trị
- Hiệu năng tốt hơn: MySQL tối ưu hóa IN thành tìm kiếm nhị phân (binary search) trong danh sách giá trị
- Dễ bảo trì: Thêm/xóa giá trị chỉ cần sửa danh sách
Kết hợp với NOT IN
SELECT * FROM InOperatorDemo WHERE ClientId NOT IN ('120', '270', '300');
Trả về các bản ghi KHÔNG có ClientId trong danh sách.
Lưu ý: Danh sách trong IN có thể chứa đến hàng nghìn giá trị, nhưng nếu quá lớn, hãy cân nhắc dùng bảng tạm (temporary table) hoặc JOIN để hiệu năng tốt hơn.