Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL SELECT với nhiều điều kiện WHERE dùng IN()?

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ểmIN()OR
Đọc/viếtNgắn gọn, rõ ràngDài, lặp lại cột
Hiệu năngTối ưu tốt (range optimizer)Tương đương nếu ít giá trị
Giá trị độngDễ build từ arrayPhức tạp hơn
NULLIN(1, NULL) không khớp NULLcol = 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'));