Giải pháp: Toán tử OR
Sử dụng OR kết hợp nhiều điều kiện trên các cột khác nhau.
Ví dụ minh họa
Tạo bảng nhân viên
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(10),
LastName VARCHAR(10),
Age INT,
CountryName VARCHAR(10)
);
mysql> INSERT INTO DemoTable(FirstName, LastName, Age, CountryName) VALUES('John', 'Smith', 21, 'US');
mysql> INSERT INTO DemoTable(FirstName, LastName, Age, CountryName) VALUES('Carol', 'Taylor', 22, 'AUS');
mysql> INSERT INTO DemoTable(FirstName, LastName, Age, CountryName) VALUES('David', 'Miller', 19, 'UK');
Dữ liệu gốc
+----+-----------+----------+------+-------------+ | Id | FirstName | LastName | Age | CountryName | +----+-----------+----------+------+-------------+ | 1 | John | Smith | 21 | US | | 2 | Carol | Taylor | 22 | AUS | | 3 | David | Miller | 19 | UK | +----+-----------+----------+------+-------------+
Truy vấn: FirstName='Carol' HOẶC Age=22 HOẶC CountryName='AUS'
mysql> SELECT * FROM DemoTable
-> WHERE FirstName = 'Carol'
-> OR Age = 22
-> OR CountryName = 'AUS';
Kết quả
+----+-----------+----------+------+-------------+ | Id | FirstName | LastName | Age | CountryName | +----+-----------+----------+------+-------------+ | 2 | Carol | Taylor | 22 | AUS | +----+-----------+----------+------+-------------+
Giải thích
- Dòng 2 thỏa mãn tất cả 3 điều kiện (Carol, 22, AUS)
- OR: Chỉ cần một điều kiện TRUE
- Dòng 1: John ≠ Carol, 21 ≠ 22, US ≠ AUS → FALSE
- Dòng 3: David ≠ Carol, 19 ≠ 22, UK ≠ AUS → FALSE
Cách thay thế: IN() cho cùng một cột
-- Nếu kiểm tra cùng một cột với nhiều giá trị
WHERE CountryName IN ('US', 'AUS', 'UK')
Tối ưu hiệu năng
- OR trên nhiều cột khác nhau → khó dùng index composite
- Mỗi cột cần index riêng:
INDEX idx_fn(FirstName), INDEX idx_age(Age), INDEX idx_cn(CountryName) - MySQL có thể dùng
Index Merge(union/intersection) nhưng không luôn tối ưu
Cách viết gọn hơn (MySQL)
WHERE 'Carol' IN (FirstName, LastName, CountryName) OR 22 IN (Age, SomeOtherCol) OR 'AUS' IN (CountryName, FirstName);
Chỉ dùng khi các cột cùng kiểu dữ liệu.
Ứng dụng: Tìm kiếm toàn văn bản đơn giản
SELECT * FROM products WHERE name LIKE '%search%' OR description LIKE '%search%' OR sku LIKE '%search%' OR tags LIKE '%search%';
→ Cân nhắc FULLTEXT INDEX cho tìm kiếm thực tế.