Giải pháp: Toán tử IN()
IN(value1, value2, ...) thay thế cho nhiều OR: col = v1 OR col = v2 OR ...
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(100)); mysql> INSERT INTO DemoTable VALUES(10, 'John'), (59, 'Carol'), (20, 'Sam'), (45, 'David');
Dữ liệu gốc
+------+-------+ | Id | Name | +------+-------+ | 10 | John | | 59 | Carol | | 20 | Sam | | 45 | David | +------+-------+
Truy vấn IN()
mysql> SELECT * FROM DemoTable WHERE Id IN(59, 45);
Kết quả
+------+-------+ | Id | Name | +------+-------+ | 59 | Carol | | 45 | David | +------+-------+
IN() vs OR
| Đặc điểm | IN() | OR |
|---|---|---|
| Đọc/viết | Ngắn gọn, rõ ràng | Dài, lặp lại cột |
| Hiệu năng | Tối ưu tốt (range optimizer) | Tương đương nếu ít giá trị |
| Giá trị động | Dễ build từ array | Phức tạp hơn |
| NULL | IN(1, NULL) không khớp NULL | col = 1 OR col IS NULL |
NOT IN
SELECT * FROM DemoTable WHERE Id NOT IN(10, 20);
Lưu ý: NOT IN(..., NULL) luôn trả về empty (vì NULL comparison = UNKNOWN).
Subquery trong IN()
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'VN');
Lưu ý hiệu năng
- IN() với list hằng số: MySQL tối ưu tốt (binary search trong list)
- IN() với subquery: Có thể chậm, cân nhắc JOIN/EXISTS
- List quá lớn (>1000): Cân nhắc temp table hoặc JOIN
Mở rộng: IN với tuple (MySQL 8.0+)
SELECT * FROM DemoTable WHERE (Id, Name) IN ((10, 'John'), (59, 'Carol'));