Dấu phần trăm đặt sai một chỗ biến truy vấn 0,02 giây thành 4 giây. Và không ai nhìn ra bằng mắt thường.
Bài toán
Tìm mọi nhân viên có tên bắt đầu bằng “Ng”. Hai ký tự đại diện cần thuộc:
%— thay cho bất kỳ số ký tự nào, kể cả không có ký tự nào_— thay cho đúng một ký tự
SELECT * FROM nhan_vien WHERE ten LIKE 'Ng%';
Lỗi thường gặp
1. Đặt % ở đầu
WHERE ten LIKE '%an%'
Chỉ mục được sắp theo thứ tự chữ cái, nên nó chỉ tìm nhanh được phần đầu của chuỗi. Bắt đầu bằng % nghĩa là máy phải đọc từng dòng một. Trên bảng 5 triệu dòng, đây là khác biệt giữa 0,02 giây và 4 giây.
Cần tìm giữa chuỗi thật sự thì dùng full-text search, đừng ép LIKE làm việc đó.
2. Tưởng LIKE luôn phân biệt hoa thường
Tuỳ hệ quản trị. MySQL mặc định không phân biệt; PostgreSQL có phân biệt. Muốn chắc chắn, ép cả hai vế:
WHERE LOWER(ten) LIKE 'ng%' -- nhưng mất chỉ mục
WHERE ten ILIKE 'ng%' -- PostgreSQL, giữ được chỉ mục nếu có index phù hợp
3. Quên escape ký tự đặc biệt
Tìm chuỗi chứa dấu % thật sự:
WHERE ma_giam_gia LIKE '%\%%' ESCAPE '\'
4. Dùng LIKE khi chỉ cần so bằng
WHERE ma = 'A001' -- nhanh
WHERE ma LIKE 'A001' -- chậm hơn, không được lợi gì
Khi cần mạnh hơn: biểu thức chính quy
-- Tên bắt đầu bằng nguyên âm (PostgreSQL)
WHERE ten ~* '^[aeiou]'
-- MySQL
WHERE ten REGEXP '^[aeiou]'
Đây chính là dạng bài Weather Observation Station 6–12 của HackerRank.
Luyện tập
- HackerRank — Weather Observation Station 6, 7, 8, 9, 10, 11, 12
- LeetCode 1667 — Fix Names in a Table
- LeetCode 1517 — Find Users With Valid E-Mails
Tóm lại
%là bất kỳ số ký tự nào,_là đúng một ký tự.LIKE 'x%'dùng được chỉ mục;LIKE '%x%'thì không.- Phân biệt hoa thường tuỳ hệ quản trị — đừng đoán.
- Bọc
LOWER()quanh cột là mất chỉ mục. - So bằng thì dùng
=, đừng dùngLIKE.
Bạn vừa học xong LIKE và ký tự đại diện
Sẵn sàng luyện tập chưa?
Làm bài tập LIKE và ký tự đại diện trên dữ liệu thật, chấm điểm ngay khi bạn bấm chạy.
Bắt đầu luyện tập →