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

Chọn dòng khi một trong nhiều cột bằng giá trị cụ thể trong MySQL?

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ế.