MySQL - Operator RLIKE

Xin chào, những người yêu thích cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của toán tử RLIKE trong MySQL. Là một giáo viên khoa học máy tính gần gũi, tôi ở đây để hướng dẫn bạn qua chủ đề này với rất nhiều ví dụ và giải thích. Vậy, lấy sẵn sàng vở ghi chép ảo của bạn, và chúng ta cùng bắt đầu!

MySQL - RLIKE Operator

Toán tử RLIKE trong MySQL

RLIKE là gì?

RLIKE là một toán tử mạnh mẽ trong MySQL cho phép chúng ta thực hiện khớp mẫu bằng cách sử dụng biểu thức chính quy. Bây giờ, tôi biết bạn đang nghĩ gì - "Biểu thức chính quy? Điều đó听起来 đáng sợ!" Nhưng đừng lo lắng, chúng ta sẽ phân tích nó từng bước.

Hãy nghĩ về RLIKE như một công cụ tìm kiếm siêu thông minh. Nó giống như có một thám tử trong cơ sở dữ liệu của bạn có thể tìm thấy thông tin dựa trên các mẫu phức tạp. Thật thú vị phải không?

Cú pháp cơ bản

Cú pháp cơ bản của toán tử RLIKE là:

expr RLIKE pattern

Ở đây, expr là biểu thức (thường là tên cột) mà chúng ta muốn tìm kiếm, và pattern là biểu thức chính quy mà chúng ta muốn khớp.

Hãy bắt đầu với một ví dụ đơn giản:

SELECT * FROM customers WHERE last_name RLIKE 'son$';

Truy vấn này sẽ tìm thấy tất cả các khách hàng có họ kết thúc bằng 'son'. Ký tự $ trong mẫu có nghĩa là "cuối chuỗi". Do đó, nó sẽ khớp với các tên như Johnson, Wilson hoặc Anderson.

Các mẫu sử dụng với RLIKE

Bây giờ, hãy xem xét một số mẫu phổ biến mà chúng ta có thể sử dụng với RLIKE. Tôi thích nghĩ về chúng như là những mật mã mà thám tử cơ sở dữ liệu của chúng ta sử dụng để giải quyết bí ẩn!

Mẫu Mô tả Ví dụ
^ Khớp với đầu của chuỗi '^A' khớp với 'Apple' nhưng không khớp với 'Banana'
$ Khớp với cuối của chuỗi 'e$' khớp với 'Apple' nhưng không khớp với 'Banana'
. Khớp với bất kỳ ký tự đơn nào 'b.t' khớp với 'bat', 'bit', 'but', v.v.
* Khớp với không hoặc nhiều lần ký tự trước đó 'go*gle' khớp với 'ggle', 'google', 'gooogle', v.v.
+ Khớp với một hoặc nhiều lần ký tự trước đó 'go+gle' khớp với 'google', 'gooogle' nhưng không khớp với 'ggle'
[] Khớp với bất kỳ ký tự đơn nào trong ngoặc '[aeiou]' khớp với bất kỳ nguyên âm nào
[^] Khớp với bất kỳ ký tự đơn nào không trong ngoặc '[^0-9]' khớp với bất kỳ ký tự không phải số nào

Hãy apply một số mẫu này!

SELECT * FROM products WHERE name RLIKE '^A.*e$';

Truy vấn này tìm thấy tất cả các sản phẩm có tên bắt đầu bằng 'A' và kết thúc bằng 'e'. .* ở giữa có nghĩa là "không hoặc nhiều ký tự bất kỳ". Do đó, nó sẽ khớp với các tên như "Apple", "Airplane" hoặc thậm chí chỉ là "Ae".

RLIKE trên chuỗi

RLIKE không chỉ dành cho việc tìm kiếm trong bảng. Chúng ta có thể sử dụng nó trực tiếp trên các chuỗi nữa! Điều này rất tốt để kiểm tra các mẫu trước khi sử dụng chúng trong một truy vấn.

SELECT 'MySQL' RLIKE 'SQL$';

Truy vấn này sẽ trả về 1 (đúng) vì 'MySQL' thực sự kết thúc bằng 'SQL'.

Đây là một ví dụ thú vị:

SELECT 'Mississippi' RLIKE 's+is+';

Truy vấn này trả về 1 vì 'Mississippi' chứa một hoặc nhiều 's' tiếp theo là 'i' tiếp theo là một hoặc nhiều 's'. Nó khớp với 'ssis' ở giữa từ.

Toán tử RLIKE sử dụng trong chương trình khách

Bây giờ, hãy xem cách chúng ta có thể sử dụng RLIKE trong một tình huống phức tạp hơn. Hãy tưởng tượng chúng ta có một bảng địa chỉ email, và chúng ta muốn tìm tất cả các địa chỉ Gmail. Đây là cách chúng ta có thể làm:

SELECT * FROM users WHERE email RLIKE '^[A-Za-z0-9._%+-]+@gmail\\.com$';

Wow, điều đó trông phức tạp! Hãy phân tích nó:

  • ^ : Đầu của chuỗi
  • [A-Za-z0-9._%+-]+ : Một hoặc nhiều chữ cái, số hoặc ký tự đặc biệt cho phép trong địa chỉ email
  • @ : Ký tự @
  • gmail\\.com : Ngoại lệ "gmail.com" (chúng ta cần thoát dấu chấm với một gạch ngang)
  • $ : Cuối của chuỗi

Mẫu này sẽ khớp với bất kỳ địa chỉ Gmail tiêu chuẩn nào.

Đây là một câu chuyện nhỏ từ kinh nghiệm giảng dạy của tôi: Tôi từng có một học sinh đang cố gắng tìm tất cả các 用户 có địa chỉ email AOL trong một cơ sở dữ liệu. Anh ấy đang kiểm tra từng mục手动 (Có hàng ngàn mục!). Khi tôi chỉ cho anh ấy cách làm với RLIKE, anh ấy rất vui và gần như nhảy múa trong lớp học!

Thời gian thực hành!

Hãy kết thúc với một bài tập thú vị. Bạn có thể viết một mẫu RLIKE để tìm tất cả các số điện thoại ở định dạng (XXX) XXX-XXXX? Hãy thử và sau đó kiểm tra câu trả lời dưới đây!

SELECT * FROM contacts WHERE phone RLIKE '^\\\([0-9]{3}\\\) [0-9]{3}-[0-9]{4}$';

Mẫu này khớp với:

  • ^\\\( : Bắt đầu bằng một ngoặc mở (thoát hai lần vì nó đặc biệt trong cả regex và MySQL)
  • [0-9]{3} : Chính xác ba chữ số
  • \\\) : Ngoặc đóng
  • ` ` : Một khoảng trống
  • [0-9]{3} : Ba chữ số tiếp theo
  • - : Dấu gạch ngang
  • [0-9]{4} : Bốn chữ số cuối cùng
  • $ : Cuối của chuỗi

Và thế là xong! Bây giờ bạn đã được trang bị sức mạnh của RLIKE. Nhớ rằng, như bất kỳ siêu năng lực nào, hãy sử dụng nó một cách khôn ngoan. Chúc mừng bạn, các phù thủy cơ sở dữ liệu tương lai!

Credits: Image by storyset