Trong MariaDB, LIKE
cho phép bạn thực hiện đối sánh mẫu. Nó xác định xem một chuỗi ký tự cụ thể có khớp với một mẫu được chỉ định hay không. Nó trả về 1
(TRUE) hoặc 0
(SAI).
Một mẫu có thể bao gồm các ký tự thông thường, cũng như %
và _
ký tự đại diện.
Các ký tự đại diện đó được giải thích trong bảng sau.
Ký tự đại diện | Mô tả |
---|---|
% | Đối sánh bất kỳ chuỗi nào không hoặc nhiều ký tự. Nó có thể được sử dụng như một tiền tố hoặc một hậu tố, và nó cũng có thể được sử dụng ở giữa một chuỗi. |
_ | Khớp với bất kỳ ký tự đơn nào. |
Cú pháp
Cú pháp như sau:
expr LIKE pat [ESCAPE 'escape_char']
Ví dụ
Giả sử chúng ta có bảng sau:
SELECT * FROM Pets;
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
Dưới đây là một ví dụ để chứng minh cách LIKE
nhà điều hành hoạt động.
SELECT *
FROM Pets
WHERE PetName LIKE 'F%';
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Trong ví dụ này, tôi đã sử dụng LIKE
toán tử kết hợp với %
toán tử ký tự đại diện để trả về vật nuôi có tên bắt đầu bằng chữ cái F
.
Phân biệt chữ hoa chữ thường
LIKE
thực hiện đối sánh chuỗi con không phân biệt chữ hoa chữ thường nếu đối chiếu cho biểu thức và mẫu không phân biệt chữ hoa chữ thường.
Do đó, chúng ta có thể thay đổi ví dụ trước để sử dụng f
chữ thường , và vẫn nhận được kết quả tương tự:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%';
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Tuy nhiên, chúng tôi có thể buộc so khớp phân biệt chữ hoa chữ thường bằng cách sử dụng COLLATE
mệnh đề với một đối chiếu nhị phân. Ngoài ra, bạn có thể sử dụng CAST()
để buộc nó thành một chuỗi nhị phân.
Ví dụ:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%' COLLATE utf8_bin;
Kết quả:
Empty set (0.000 sec)
Không có kết quả nào được trả lại.
Nhưng nếu chúng ta thay đổi nó thành chữ hoa F
:
SELECT *
FROM Pets
WHERE PetName LIKE 'F%' COLLATE utf8_bin;
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Chúng tôi nhận được ba trận đấu, như mong đợi.
Đối số dạng số
Các đối số dạng số được ép buộc thành chuỗi nhị phân.
SELECT *
FROM Pets
WHERE PetId LIKE 7;
Kết quả:
+-------+-----------+---------+---------+------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------+ | 7 | 3 | 2 | Bark | NULL | +-------+-----------+---------+---------+------+
Ngày
Dưới đây là một ví dụ khớp với năm từ một ngày:
SELECT *
FROM Pets
WHERE DOB LIKE '2020%';
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Bạn cũng có thể sử dụng LIKE
toán tử so với kết quả của các hàm ngày, chẳng hạn như DAYNAME()
, MONTHNAME()
, v.v.
SELECT *
FROM Pets
WHERE MONTHNAME(DOB) LIKE 'Nov%';
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +-------+-----------+---------+---------+------------+
_
Toán tử ký tự đại diện
Dấu gạch dưới (_
) toán tử ký tự đại diện khớp với bất kỳ ký tự đơn nào.
Ví dụ:
SELECT *
FROM Pets
WHERE PetName LIKE '_e%';
Kết quả:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 2 | 3 | 3 | Fetch | 2019-08-16 | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
Trong trường hợp này, chúng tôi đã đối sánh tên vật nuôi với ký tự thứ hai là e
.
Nhân vật Escape
Đôi khi bạn có thể rơi vào tình huống cần tìm kiếm dấu gạch dưới hoặc dấu phần trăm. Trong những trường hợp như vậy, bạn có thể sử dụng dấu gạch chéo ngược (\
) để thoát khỏi các ký tự này. Điều này sẽ ngăn chúng được hiểu là các ký tự đại diện.
Giả sử chúng ta có bảng sau:
SELECT * FROM Owners;
Kết quả:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Lưu ý rằng Chủ sở hữu 2 (Bart) có địa chỉ email chứa dấu gạch dưới.
Dưới đây là một ví dụ về những gì sẽ xảy ra khi chúng ta không thoát khỏi dấu gạch dưới:
SELECT * FROM Owners
WHERE Email LIKE 'b_%';
Kết quả:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Trong trường hợp này, nó khớp với hai hàng. Trong trường hợp này, không quan trọng ký tự thứ hai - nó khớp với bất kỳ tính cách. Việc hàng đầu tiên có dấu gạch dưới cho ký tự thứ hai chỉ là một sự trùng hợp ngẫu nhiên. Nó sẽ phù hợp ngay cả khi nó là một cái gì đó khác.
Nhưng điều gì sẽ xảy ra nếu chúng ta chỉ muốn đối sánh những địa chỉ email có dấu gạch dưới thực sự làm ký tự thứ hai của chúng?
Đó là lúc nhân vật trốn thoát xuất hiện.
SELECT * FROM Owners
WHERE Email LIKE 'b\_%';
Kết quả:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Bây giờ chúng ta chỉ nhận được một hàng - hàng có dấu gạch dưới là ký tự thứ hai.
Thay đổi ký tự thoát
Có thể thay đổi ký tự thoát. Bạn có thể thực hiện việc này với ESCAPE
đối số.
Ví dụ:
SELECT * FROM Owners
WHERE Email LIKE 'b*_%' ESCAPE '*';
Kết quả:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Trong trường hợp này, tôi đã gán dấu hoa thị (*
) là ký tự thoát.
Điều này có thể đặc biệt hữu ích khi bạn cần sử dụng dấu gạch chéo ngược cho các mục đích khác, chẳng hạn như mã hóa các ký tự đặc biệt. Trong những trường hợp như vậy, bạn có thể thấy mình phải "thoát kép" những ký tự này, điều này có thể trở nên khó hiểu. Do đó, thay đổi ký tự thoát có thể hữu ích trong những tình huống như vậy.
Giá trị NULL
Phần trăm (%
) ký tự đại diện khớp với bất kỳ thứ gì - gần như. Một điều nó không khớp là NULL
.
SELECT * FROM Owners
WHERE Email LIKE '%';
Kết quả:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Trong bảng của chúng tôi, có hai hàng với NULL
trong Email
nhưng chúng không được trả lại ở đây.
Hiệu suất
Các truy vấn có chứa LIKE
toán tử có thể chạy chậm hơn nhiều so với các truy vấn khác và bạn có thể nên tránh sử dụng LIKE
trừ khi bạn thực sự cần nó. Sử dụng %
toán tử làm tiền tố có thể đặc biệt chậm.
Điều đó không có nghĩa là bạn hoàn toàn không nên sử dụng nó. LIKE
toán tử là một phần không thể thiếu của SQL và bạn sẽ gặp phải nhiều trường hợp trong đó nó sẽ là lựa chọn duy nhất (hoặc ít nhất, là lựa chọn tốt nhất).
NOT LIKE
Nhà điều hành
Bạn cũng có thể sử dụng NOT LIKE
để kiểm tra xem một chuỗi có không phù hợp với một mẫu.