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

Lọc dữ liệu theo nhiều cột cùng lúc trong MySQL (Tuple Comparison)

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ợ IN vớ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 đương a > 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.