Giới thiệu
MySQL hỗ trợ so sánh bộ giá trị (row constructor) với toán tử IN. Cú pháp: (cot1, cot2) IN ((val1, val2), (val3, val4), ...). Cho phép lọc chính xác các cặp giá trị mong muốn.
Ví dụ thực hành
1. Tạo bảng DemoTable810
mysql> CREATE TABLE DemoTable810 (First INT, Second INT);
2. Chèn dữ liệu
mysql> INSERT INTO DemoTable810 VALUES (20,40),(70,90),(120,150),(78,128);
3. Lọc cặp (20,40) và (120,150)
mysql> SELECT * FROM DemoTable810 WHERE (First, Second) IN ((120,150),(20,40));
4. Kết quả
+-------+--------+
| First | Second |
+-------+--------+
| 20 | 40 |
| 120 | 150 |
+-------+--------+
So sánh với cách viết truyền thống
-- Cách cũ: OR lồng nhau (dài, dễ sai)
SELECT * FROM DemoTable810
WHERE (First = 20 AND Second = 40)
OR (First = 120 AND Second = 150);
-- Cách IN tuple (ngắn, rõ ràng, tối ưu tốt hơn)
SELECT * FROM DemoTable810 WHERE (First, Second) IN ((20,40),(120,150));
Ứng dụng thực tế
- Tìm đơn hàng theo cặp
(CustomerId, OrderId). - Kiểm tra sự tồn tại của khóa chính composite:
WHERE (col1, col2) IN (SELECT col1, col2 FROM other_table). - Xóa nhiều bản ghi theo khóa composite:
DELETE FROM t WHERE (a,b) IN ((1,2),(3,4)).
Lưu ý
- Hỗ trợ từ MySQL 4.1.
- Số lượng cột trong tuple phải khớp.
- Có thể dùng subquery trả về nhiều cột:
WHERE (a,b) IN (SELECT a,b FROM ...). - Index composite trên
(First, Second)sẽ giúp truy vấn này rất nhanh.