Courses
Thích hay không, toán tử LIKE là thiết yếu trong SQL. Nó giúp các nhà khoa học dữ liệu và kỹ sư dữ liệu có khả năng lọc dữ liệu theo các chuỗi khớp cụ thể. Trong hướng dẫn này, tôi sẽ dẫn bạn qua cách dùng LIKE để khớp mẫu, từ cơ bản đến các kỹ thuật nâng cao.
TL;DR
- Toán tử SQL
LIKEdùng hai ký tự đại diện để khớp mẫu:%(bất kỳ số lượng ký tự nào) và_(chính xác một ký tự) - Kết hợp
LIKEvớiNOT,LOWER()/UPPER(),OR/AND, vàCASE WHENđể lọc linh hoạt - Dùng
ILIKE(PostgreSQL/Redshift) để khớp không phân biệt hoa thường, hoặc bọc cột trongLOWER() - Ký tự đại diện
%ở đầu (ví dụ,%pattern) vô hiệu hóa việc dùng chỉ mục—hãy cân nhắc tìm kiếm toàn văn cho bộ dữ liệu lớn - SQL Server hỗ trợ
[]và[^]cho các khoảng ký tự; MySQL hỗ trợRLIKEđể khớp dựa trên regex
Toán tử SQL LIKE để khớp mẫu
Lưu ý: Để tự chạy toàn bộ mã ví dụ trong hướng dẫn này, bạn có thể tạo một sổ tay DataLab miễn phí với SQL đã cài đặt và các cơ sở dữ liệu có dữ liệu mẫu.
Giả sử bạn có bảng employees và muốn tìm tất cả tên bắt đầu bằng ‘A’:
employees | |||||
emp_no | birth_date | first_name | last_name | gender | hire_date |
10001 | 1953-09-02T00:00:00.000Z | Georgi | Facello | M | 1986-06-26T00:00:00.000Z |
10002 | 1964-06-02T00:00:00.000Z | Bezalel | Simmel | F | 1985-11-21T00:00:00.000Z |
10003 | 1959-12-03T00:00:00.000Z | Parto | Bamford | M | 1986-08-28T00:00:00.000Z |
Bạn có thể dành thời gian lướt bảng thủ công. Nhưng tại sao phải làm vậy khi đã có toán tử LIKE?
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'A%'Điều kỳ diệu nằm ở mệnh đề `WHERE first_name LIKE ‘A%’`, nghĩa là “tìm tất cả first_name bắt đầu bằng "A" và kết thúc bằng bất kỳ số lượng ký tự nào.” A% ở đây được gọi là một mẫu để khớp.
% không phải là ký tự đại diện duy nhất bạn có thể dùng cùng với toán tử LIKE. Bạn cũng có thể dùng dấu gạch dưới _:
`%`khớp với bất kỳ số lượng ký tự nào._khớp với đúng một ký tự.
Cú pháp rất dễ nhớ. Chỉ đơn giản là:
column_name LIKE patternBạn có thể dùng LIKE để đạt được nhiều kiểu khớp mẫu. Cách làm như sau:
Ví dụ SQL LIKE dành cho người mới bắt đầu
Bên dưới, chúng tôi nêu một số ví dụ thực tế về cách bạn có thể dùng câu lệnh LIKE và các kết quả từ bộ dữ liệu mẫu của chúng tôi.
1. Dùng LIKE để khớp chuỗi chính xác
Nếu bạn muốn thực hiện khớp chuỗi chính xác, hãy dùng LIKE mà không có ‘%’ hoặc ‘_’
SELECT
first_name, last_name
FROM employees
WHERE first_name LIKE 'Barry' -- the same as WHERE first_name = ‘Barry’2. Dùng ‘%’ để khớp bất kỳ số lượng ký tự nào
‘%’ có thể dùng để khớp bất kỳ (kể cả không có) số lượng ký tự nào – số, chữ cái, hoặc ký hiệu.
Giả sử bạn muốn tìm tất cả nhân viên có tên bắt đầu bằng ‘Adam’; bạn có thể dùng mẫu ‘Adam%’
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Adam%'Để tìm tên kết thúc bằng "z" hãy thử mẫu ‘%z’. Bạn cũng có thể dùng nhiều ‘%’ trong một mẫu. Ví dụ, nếu muốn tìm tên có chứa "z", hãy dùng ‘%z%’.
3. Dùng ‘_’ để khớp một (và chỉ một) ký tự
Giống trò chơi Hangman, dấu gạch dưới _ chỉ có thể khớp một ký tự.
Có bao nhiêu cách viết Le_n? Mẫu này sẽ khớp mọi thứ từ "Lexn", "LeAn", "Le3n", hoặc "Le-n".
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE 'Le_n'Có những tên nào chỉ gồm ba ký tự? Chúng ta có thể tìm bằng ba dấu gạch dưới liên tiếp ___ làm mẫu.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '___'4. Dùng cả ‘%’ và ‘_’ để khớp mọi mẫu
Tất nhiên, bạn có thể dùng cả ‘%’ và ‘_’ để tạo ra các mẫu thú vị.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name LIKE '%ann_'Mẫu ‘%ann’ khớp một chuỗi bắt đầu bằng bất kỳ số lượng ký tự nào và kết thúc bằng "ann" và một ký tự khác.
5. Dùng NOT để tìm chuỗi không khớp mẫu
Nếu bạn muốn tìm tất cả các hàng không khớp một tiêu chí cụ thể thì sao? Bạn có thể dùng toán tử NOT LIKE. Ví dụ, để tìm tất cả chức danh ngoại trừ "Staff", chúng ta có thể dùng cú pháp
`WHERE title NOT LIKE ‘Staff’`Điều này hoàn toàn tương đương với cú pháp
WHERE title != 'Staff'SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE 'Staff'Tất nhiên, bạn có thể dùng NOT LIKE với bất kỳ mẫu nào chúng tôi đã mô tả.
SELECT DISTINCT
title
FROM titles
WHERE title NOT LIKE '%engineer'6. Dùng LOWER (hoặc UPPER) với LIKE để khớp mẫu không phân biệt hoa thường
Bạn có thể dùng cú pháp sau nếu cần khớp mẫu nhưng không chắc chuỗi được lưu dưới dạng chữ thường, chữ hoa, hay lẫn lộn.
LOWER(column_name) LIKE patternHàm LOWER() trả về tất cả chuỗi ở chữ thường, bất kể chúng được lưu là chữ hoa, chữ thường, hay lẫn lộn.
Khi dùng cú pháp này, hãy đảm bảo bạn viết mẫu hoàn toàn bằng chữ thường! Nếu không, bạn có thể không nhận được kết quả khớp.
Bạn cũng có thể thay LOWER bằng UPPER trong cú pháp trên. Hãy chắc chắn viết mẫu bằng chữ hoa.
`UPPER(column_name) LIKE PATTERN`Ví dụ, để tìm xem tên nhân viên là "Joanne", "JoAnne", "Joanna", hay "JoAnna", hãy thử một trong các cách sau:
SELECT DISTINCT
first_name
FROM employees
WHERE LOWER(first_name) LIKE 'joann_'SELECT DISTINCT
first_name
FROM employees
WHERE UPPER(first_name) LIKE 'JOANN_'7. SQL LIKE với nhiều giá trị dùng OR/AND
Bạn cũng có thể kết hợp nhiều điều kiện bằng cú pháp LIKE.
Ví dụ, dùng điều kiện OR để tìm kết quả thỏa mãn ít nhất một trong nhiều mẫu LIKE.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE 'Ad_l' OR
first_name LIKE 'Ad_m'Ngược lại, để tìm một chuỗi khớp nhiều điều kiện LIKE, hãy dùng từ khóa AND.
SELECT DISTINCT
first_name
FROM employees
WHERE
first_name LIKE '%am%' AND
first_name LIKE '%me%'Cú pháp LIKE có thể áp dụng cho nhiều cột miễn là kiểu dữ liệu của chúng là ký tự độ dài biến (varchar). Biết vậy, chúng ta có thể tìm tên nhân viên có chữ cái đầu là "Z. Z."
SELECT DISTINCT
first_name, last_name
FROM employees
WHERE
first_name LIKE 'Z%' AND
last_name LIKE 'Z%'8. Dùng LIKE trong mệnh đề SELECT CASE WHEN
Cho đến giờ, chúng ta tập trung sử dụng LIKE làm điều kiện chọn bản ghi trong mệnh đề WHERE. Chúng ta cũng dùng LIKE trong mệnh đề SELECT. Ví dụ, ta có thể tìm xem có bao nhiêu nhân viên tên "Adam" trong cơ sở dữ liệu không?
SELECT
COUNT(CASE WHEN first_name LIKE 'Adam' THEN 1 END) num_employees_adam
FROM employeesMặt khác, có bao nhiêu nhân viên có chữ cái đầu là "A.Z."?
SELECT
COUNT(CASE WHEN first_name LIKE 'A%' AND last_name LIKE 'Z%' THEN 1 END) num_employees
FROM employeesCác mẫu thường dùng trong SQL LIKE
Dưới đây là tóm tắt các mẫu chúng ta đã thảo luận để tham khảo nhanh:
| Mẫu | Mô tả | Trường hợp sử dụng ví dụ |
|---|---|---|
| A% | Khớp chuỗi bắt đầu bằng "A" | Tìm tên bắt đầu bằng "A" |
| %z% | Khớp chuỗi có chứa "z" | Tìm tên có chứa "z" |
| Le_n | Khớp các chuỗi như "Len", "Leon", v.v. | Tìm tên với một ký tự biến thể đơn |
| %ann_ | Khớp chuỗi kết thúc bằng "ann" và thêm một ký tự | Tìm tên như "Joann", "Joanna" |
Ví dụ SQL LIKE ở mức trung cấp
Hàm LIKE về cơ bản khá giống nhau giữa các hệ SQL khác nhau (ví dụ PostgreSQL, MySQL, Redshift, v.v.). Tuy nhiên, một số có các biến thể bổ sung của hàm LIKE đáng để nhắc đến.
1. Toán tử ILIKE
Có sẵn trong Redshift và PostgreSQL, ILIKE là phiên bản không phân biệt hoa thường của LIKE. Do đó, tất cả các câu sau là tương đương.
SELECT
datacamp ILIKE ‘datacamp’, -- returns TRUE
DATACAMP ILIKE ‘datacamp’, -- returns TRUE
Datacamp ILIKE ‘datacamp’, -- returns TRUE
datacamp ILIKE ‘DataCamp’, -- returns TRUE2. Dùng ngoặc vuông [] và [^] làm ký tự đại diện
Người dùng T-SQL hoặc SQL Server có thêm ký tự đại diện để khớp mẫu phức tạp hơn.
Cú pháp ngoặc vuông [] khớp bất kỳ ký tự cụ thể nào trong một khoảng hoặc tập. Ví dụ, các câu sau đều trả về TRUE.
SELECT
‘Carson’ LIKE ‘[C-K]arson’, -- returns TRUE because C is in the range C-K
‘Karson’ LIKE ‘[C-K]arson’, -- returns TRUE because K is in range
‘Larson’ LIKE ‘[CKL]arson’, -- returns TRUE because L is in the set [CKL]
‘Parson’ LIKE ‘[C-K]arson’ -- returns FALSE because P is out of rangeKý tự mũ trong ngoặc vuông [^] khớp bất kỳ một ký tự nào không nằm trong khoảng hay tập được chỉ định. Bạn có thấy vì sao các kết quả sau lại như vậy không?
SELECT
‘Carson’ LIKE ‘[^C-K]arson’ -- returns FALSE
‘Parson’ LIKE ‘[^C-K]arson’ -- returns TRUETại đây, vì "C" nằm trong khoảng [C-K], mẫu ‘C’ sẽ không khớp [^C-K]. Do đó, "Carson" sẽ không khớp [^C-K]arson, còn "Parson" thì sẽ.
3. Toán tử RLIKE
Có sẵn trong MySQL, toán tử RLIKE nhận biết các biểu thức chính quy (RegEx) trong mẫu. RegEx là công cụ mạnh mẽ và linh hoạt cho khớp mẫu nâng cao.
Hiểu biết cơ bản về RegEx luôn hữu ích, đặc biệt nếu hệ SQL của bạn hỗ trợ RLIKE. Bạn có thể tìm hiểu thêm về RegEx với khóa học Biểu thức chính quy trong Python của chúng tôi.
SELECT DISTINCT
first_name
FROM employees
WHERE first_name RLIKE 'Susann[a-e]'4. Toán tử ‘~~’
Trong PostgreSQL, ‘~~’ hoàn toàn đồng nghĩa với LIKE. Cũng có các tương đương của ILIKE, NOT LIKE, và NOT ILIKE.
Toán tử | Tương đương |
|
|
|
|
|
|
|
|
Xử lý sự cố: Lỗi và sai sót thường gặp với LIKE
Dưới đây là một số lỗi thường gặp khi dùng LIKE, và cách khắc phục:
- Không trả về kết quả: Kiểm tra phân biệt hoa thường. Trong một số biến thể SQL,
LIKEmặc định phân biệt hoa thường. DùngLOWER()hoặcILIKE(nếu được hỗ trợ) để khớp không phân biệt hoa thường. - Kết quả bất ngờ với ký tự đại diện: Đảm bảo dùng đúng
%và_.%khớp bất kỳ số lượng ký tự nào, còn_khớp đúng một ký tự. Đặt sai có thể dẫn đến kết quả ngoài ý muốn. - Vấn đề hiệu năng: Nếu truy vấn chậm, hãy kiểm tra mẫu có
%ở đầu (ví dụ,%pattern) vốn vô hiệu hóa chỉ mục. Viết lại mẫu để bắt đầu bằng chuỗi cụ thể nếu có thể. Xem phần bên dưới để biết thêm về hiệu năng. - Lỗi SQL injection: Nếu bạn dùng đầu vào người dùng trong truy vấn, hãy đảm bảo tham số hóa đúng cách để tránh lỗ hổng SQL injection.
- Ký tự đặc biệt trong mẫu: Các ký tự đại diện như
%và_trong chuỗi tìm kiếm phải được escape nếu dùng theo nghĩa đen. DùngESCAPEtrong truy vấn để định nghĩa ký tự escape.
WHERE column_name LIKE '50\% OFF' ESCAPE '\'Cân nhắc hiệu năng khi dùng toán tử LIKE
Toán tử LIKE rất hữu dụng, nhưng có thể ảnh hưởng đến hiệu năng truy vấn, đặc biệt khi dùng trên bộ dữ liệu lớn. Dưới đây là một số cân nhắc để tối ưu việc sử dụng:
- Chỉ mục: Toán tử
LIKEhoạt động tốt nhất khi mẫu bắt đầu bằng chuỗi hằng, nhưAdam%, vì cơ sở dữ liệu có thể dùng chỉ mục. Tuy nhiên, các mẫu như%Adamhoặc%Adam%yêu cầu quét toàn bảng, có thể chậm với bảng lớn. - Tránh ký tự đại diện ở đầu: Bắt đầu mẫu bằng
%, như%pattern, sẽ vô hiệu hóa chỉ mục, vì cơ sở dữ liệu phải xem xét mọi bản ghi. - Đối chiếu và khớp không phân biệt hoa thường: Dùng các hàm như
LOWER()hoặcUPPER()trên cột để tìm kiếm không phân biệt hoa thường cũng có thể khiến chỉ mục không được dùng. Thay vào đó, hãy đảm bảo collation của cơ sở dữ liệu được đặt phù hợp cho so sánh không phân biệt hoa thường. - Cách tiếp cận thay thế: Với bộ dữ liệu lớn, hãy cân nhắc dùng tìm kiếm toàn văn hoặc các tính năng tìm kiếm đặc thù của CSDL, như chỉ mục
GINindexes trong PostgreSQL hoặc chỉ mụcFULLTEXTtrong MySQL, khi thực hiện khớp chuỗi phức tạp hoặc thường xuyên. - Truy vấn chọn lọc: Giới hạn phạm vi truy vấn bằng các bộ lọc bổ sung, như khoảng ngày hoặc cột số, để giảm dữ liệu mà toán tử
LIKEphải xử lý.
LIKE so với Tìm kiếm toàn văn
Tìm kiếm toàn văn có sẵn trong các CSDL như MySQL, PostgreSQL và SQL Server. Trong khi LIKE hoạt động tốt cho khớp mẫu đơn giản, tìm kiếm toàn văn được xây dựng cho các truy vấn văn bản nâng cao. So sánh hai cách tiếp cận như sau:
| Tính năng | LIKE | Tìm kiếm toàn văn |
|---|---|---|
| Cú pháp | WHERE col LIKE '%term%' | MATCH(col) AGAINST('term') |
| Ký tự đại diện | %, _ | Toán tử Boolean, ngôn ngữ tự nhiên |
| Hỗ trợ chỉ mục | Chỉ các mẫu tiền tố (ví dụ, term%) | Chỉ mục toàn văn chuyên dụng (GIN, FULLTEXT) |
| Hiệu năng trên bảng lớn | Chậm với % ở đầu | Tối ưu cho các cột văn bản lớn |
| Xếp hạng mức độ liên quan | Không | Có |
| Tính ngôn ngữ | Không | Tạo gốc từ, từ dừng, từ đồng nghĩa |
| Phù hợp nhất cho | Mẫu chính xác, bộ dữ liệu nhỏ đến vừa | Tìm kiếm từ khóa, cột văn bản lớn |
Đối với các thao tác chuỗi nâng cao hơn ngoài khớp mẫu, xem hướng dẫn SQL CONTAINS.
Tự tin sử dụng SQL LIKE
Thành thạo các hàm SQL là chìa khóa để thành công trong khoa học dữ liệu, và lệnh LIKE của SQL cũng không ngoại lệ. Sử dụng SQL tốt sẽ thúc đẩy mạnh mẽ tiến trình phân tích của bạn, vì vậy hãy chắc chắn học thật kỹ!
Để tìm hiểu thêm về SQL, hãy xem các nội dung sau:
FAQs
LIKE có thể dùng với kiểu dữ liệu số không?
Không. Toán tử LIKE được dùng riêng cho khớp mẫu với các kiểu dữ liệu chuỗi như CHAR, VARCHAR và TEXT. Với các kiểu số, dùng các toán tử so sánh khác như =, <, >, v.v.
Hiệu năng của LIKE so với các toán tử SQL khác như thế nào?
Toán tử LIKE có thể kém hiệu quả, đặc biệt với các mẫu bắt đầu bằng %, vì nó yêu cầu quét toàn bảng. Khi đó chỉ mục không thể sử dụng hiệu quả, có thể làm chậm truy vấn trên bộ dữ liệu lớn.
Có lo ngại bảo mật nào khi dùng LIKE trong SQL không?
Mặc dù LIKE không tự thân thiếu an toàn, việc dùng trực tiếp dữ liệu người dùng trong truy vấn SQL có thể dẫn đến tấn công SQL injection. Luôn làm sạch đầu vào và cân nhắc dùng truy vấn tham số hóa để giảm thiểu rủi ro.
Xử lý tìm kiếm phân biệt hoa thường thế nào trong hệ SQL không hỗ trợ ILIKE?
Trong các hệ SQL không có ILIKE, bạn có thể dùng LOWER(column_name) LIKE LOWER(pattern) hoặc UPPER(column_name) LIKE UPPER(pattern) để thực hiện tìm kiếm không phân biệt hoa thường.
LIKE có thể dùng với các ký tự không phải ASCII không?
Có,LIKE có thể dùng với các ký tự không phải ASCII miễn là mã hóa của cơ sở dữ liệu hỗ trợ các ký tự đó. Điều này bao gồm UTF-8, vốn thường được dùng để hỗ trợ dải ký tự rộng.
Bạn sẽ sửa truy vấn LIKE thế nào để tìm ký tự đại diện theo nghĩa đen (ví dụ, % hoặc _)?
Để tìm kiếm một ký tự đại diện theo nghĩa đen % hoặc _, bạn cần dùng ký tự escape. Ví dụ, trong SQL Server, bạn có thể dùng LIKE 'A[%]%' ESCAPE '%' để tìm chuỗi chứa ký tự % theo nghĩa đen.
Bạn có thể kết hợp LIKE với các hàm SQL khác để cải thiện khả năng tìm kiếm không?
Có. Kết hợp LIKE với các hàm như CONCAT hoặc SUBSTRING có thể giúp tinh chỉnh mẫu tìm kiếm. Ví dụ, dùng CONCAT có thể xây dựng mẫu động dựa trên giá trị các cột khác.
LIKE có thể dùng kết hợp với các phép JOIN như thế nào?
LIKE có thể áp dụng trong điều kiện JOIN để khớp mẫu giữa các cột của các bảng khác nhau. Chẳng hạn, ON table1.col1 LIKE table2.col2 || '%' có thể dùng để nối bảng nơi table1.col1 bắt đầu bằng table2.col2.
Có lựa chọn thay thế nào cho LIKE để khớp mẫu phức tạp không?
Với các mẫu phức tạp hơn, những hệ SQL hỗ trợ biểu thức chính quy, như RLIKE của MySQL hoặc SIMILAR TO của PostgreSQL, có thể được dùng. Chúng cung cấp cú pháp phong phú hơn cho khớp mẫu nâng cao.
LIKE xử lý giá trị null trong cột như thế nào?
Khi một cột chứa giá trị null, LIKE sẽ không khớp các bản ghi này, vì null không được coi là bằng bất kỳ chuỗi hay mẫu nào. Để bao gồm null, hãy dùng điều kiện như OR column IS NULL.