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

Sử dụng IN cho 2 cột (tuple) trong MySQL để lọc bản ghi

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.