Để 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ách | Sử dụng Index | Ghi 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 + IN | Không | Function 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_binhoặc dùngBINARY: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%'