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

Tìm tên bắt đầu bằng a, b hoặc c trong MySQL (LIKE OR)

Để tìm các hàng mà cột chuỗi bắt đầu bằng một trong nhiều chữ cái (a, b, c), bạn dùng toán tử LIKE kết hợp OR.

Cú pháp

SELECT * FROM ten_bang
WHERE ten_cot LIKE 'A%' 
   OR ten_cot LIKE 'B%' 
   OR ten_cot LIKE 'C%';

Lưu ý: MySQL mặc định **không phân biệt chữ hoa/thường** (case-insensitive) với collation *_ci. 'A%' khớp cả 'a%', 'Adam', 'adam'.

Ví dụ minh họa

1. Tạo bảng

CREATE TABLE AllNamesStartWithAorBorC (
    Id INT NOT NULL AUTO_INCREMENT,
    EmployeeName VARCHAR(20),
    PRIMARY KEY(Id)
);

2. Chèn dữ liệu

INSERT INTO AllNamesStartWithAorBorC(EmployeeName) VALUES
('Adam'), ('Bob'), ('baden'), ('Carol'), ('Mike'), ('Larry'), ('Chris');

3. Xem toàn bộ dữ liệu

SELECT * FROM AllNamesStartWithAorBorC;

Kết quả:

+----+--------------+
| Id | EmployeeName |
+----+--------------+
| 1  | Adam         |
| 2  | Bob          |
| 3  | baden        |
| 4  | Carol        |
| 5  | Mike         |
| 6  | Larry        |
| 7  | Chris        |
+----+--------------+

4. Truy vấn: Tên bắt đầu bằng A, B hoặc C

SELECT * FROM AllNamesStartWithAorBorC
WHERE EmployeeName LIKE 'A%' 
   OR EmployeeName LIKE 'B%' 
   OR EmployeeName LIKE 'C%';

Kết quả (5 hàng):

+----+--------------+
| Id | EmployeeName |
+----+--------------+
| 1  | Adam         |
| 2  | Bob          |
| 3  | baden        |
| 4  | Carol        |
| 7  | Chris        |
+----+--------------+

Các cách viết tối ưu hơn

Cách 1: REGEXP (ngắn gọn, linh hoạt)

SELECT * FROM AllNamesStartWithAorBorC
WHERE EmployeeName REGEXP '^[ABCabc]';

^ = bắt đầu chuỗi, [ABCabc] = một trong các ký tự liệt kê.

Cách 2: SUBSTRING + IN

SELECT * FROM AllNamesStartWithAorBorC
WHERE UPPER(SUBSTRING(EmployeeName, 1, 1)) IN ('A','B','C');

Cách 3: LEFT() + IN

SELECT * FROM AllNamesStartWithAorBorC
WHERE UPPER(LEFT(EmployeeName, 1)) IN ('A','B','C');

So sánh hiệu năng

CáchSử dụng IndexGhi chú
LIKE 'A%' OR LIKE 'B%'Có (range scan)Tốt nhất cho index
REGEXP '^[ABC]'Không (full scan)MySQL < 8.0 không dùng index cho REGEXP
SUBSTRING/LEFT + INKhôngFunction trên cột → không dùng index

Khuyến nghị

  • Bảng nhỏ (<10k rows): Dùng REGEXP hoặc SUBSTRING cho code gọn
  • Bảng lớn, cần hiệu năng: Dùng LIKE 'A%' OR LIKE 'B%' OR LIKE 'C%' (tận dụng index)
  • Phân biệt hoa/thường: Thêm COLLATE utf8mb4_bin hoặc dùng BINARY: WHERE BINARY EmployeeName LIKE 'A%'
  • Nhiều chữ cái hơn: REGEXP '^[A-F]' gọn hơn nhiều OR LIKE

Mở rộng: Không bắt đầu bằng a,b,c

-- NOT REGEXP
WHERE EmployeeName NOT REGEXP '^[ABCabc]'

-- NOT LIKE (phải viết nhiều điều kiện)
WHERE EmployeeName NOT LIKE 'A%' 
  AND EmployeeName NOT LIKE 'B%' 
  AND EmployeeName NOT LIKE 'C%'
  AND EmployeeName NOT LIKE 'a%' 
  AND EmployeeName NOT LIKE 'b%' 
  AND EmployeeName NOT LIKE 'c%'