MySQL hỗ trợ so sánh tuple (bộ giá trị) trực tiếp trong mệnh đề WHERE bằng cú pháp (col1, col2) = (val1, val2). Cách này ngắn gọn, dễ đọc và hiệu năng tốt (có thể dùng index composite).
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(10),
Score INT
);
mysql> INSERT INTO DemoTable (Name, Score) VALUES
('John', 80), ('John', 90), ('Carol', 89),
('John', 86), ('Carol', 98), ('David', 99);
Dữ liệu
mysql> SELECT * FROM DemoTable;
+----+-------+-------+
| Id | Name | Score |
+----+-------+-------+
| 1 | John | 80 |
| 2 | John | 90 |
| 3 | Carol | 89 |
| 4 | John | 86 |
| 5 | Carol | 98 |
| 6 | David | 99 |
+----+-------+-------+
Truy vấn: Lọc chính xác cặp (Name, Score)
mysql> SELECT * FROM DemoTable
WHERE (Name, Score) = ('John', 90)
OR (Name, Score) = ('Carol', 98);
Kết quả
+----+-------+-------+
| Id | Name | Score |
+----+-------+-------+
| 2 | John | 90 |
| 5 | Carol | 98 |
+----+-------+-------+
So sánh với cách viết truyền thống
-- Cách cũ, dài hơn
WHERE (Name = 'John' AND Score = 90) OR (Name = 'Carol' AND Score = 98)
Ưu điểm của Tuple Comparison
- Ngắn gọn, dễ đọc, ít lỗi gõ nhầm.
- MySQL tối ưu hóa nội bộ, có thể sử dụng Composite Index
INDEX(Name, Score)hiệu quả. - Hỗ trợ
INvới tuple:WHERE (Name, Score) IN (('John', 90), ('Carol', 98)). - Hỗ trợ so sánh
>,<,>=,<=theo thứ tự từ điển (lexicographical):(a, b) > (c, d)tương đươnga > c OR (a = c AND b > d).
Lưu ý: Số lượng và thứ tự cột trong tuple hai vế phải khớp nhau.