G-LEARNING
G-LEARNING
Thảo luận 0 thảo luận
Vỗ tay 0 vỗ tay
Lượt xem 1767 lượt xem

Hướng dẫn cách dùng cú pháp biểu thức chính quy (Regular Expressions - REGEXP) trong MySQL

May 14 2020

Biểu thức chính quy là gì?

Biểu thức chính quy giúp tìm kiếm dữ liệu phù hợp với tiêu chí phức tạp. Nếu bạn đã từng làm việc với các ký tự đại diện trước đây, bạn có thể đặt câu hỏi là tại sao lại phải học các biểu thức chính quy trong khi bạn có thể nhận được kết quả tương tự khi sử dụng các ký tự đại diện. Bởi vì khi so sánh với ký tự đại diện, các biểu thức chính quy cho phép chúng ta tìm kiếm dữ liệu phù hợp với những tiêu chí phức tạp hơn nhiều. 

Cú pháp cơ bản

Cú pháp cơ bản của biểu thức chính quy như sau:

Trong đó:

  • “SELECT statements…” là câu lệnh SELECT chuẩn
  • “WHERE fieldname” là tên cột mà biểu thức chính quy sẽ được thực hiện trên đó
  • “REGEXP ‘pattern'” REGEXP là toán tử biểu thức chính quy và ‘pattern’ đại diện cho mẫu được khớp bởi REGEXP. RLIKE là từ đồng nghĩa với REGEXP và đạt được kết quả giống như là REGEXP nhưng để tránh nhầm lẫn với toán tử LIKE, tốt hơn là nên sử dụng REGEXP.

Để thực hiện theo các ví dụ minh họa, bạn có thể tải dữ liệu myflixdb tại đây:

https://drive.google.com/uc?export=download&id=0B_vqvT0ovzHccjhtdGlrZ0MtZ0k

Xem xét ví dụ sau:

Truy vấn trên tìm kiếm tất cả các bộ phim có từ “code” trong tựa đề. Nó không quan trọng từ “code” nằm ở đầu, giữa hay cuối tiêu đề. Miễn là có chứa từ “code” thì nó sẽ được xem xét.

Giả sử rằng chúng ta muốn tìm kiếm tên phim bắt đầu bằng a,b,c hoặc d và theo sau là bất kỳ số lượng ký tự nào khác. Làm thế nào để thực hiện được điều đó? Chúng ta có thể sử dụng biểu thức chính quy cùng với các meta-characters để đạt được kết quả mong muốn. 

Thực hiện câu lệnh trên cho dữ liệu myflixdb trong MySQL sẽ cho ra kết quả:

Bây giờ hãy xem xét kỹ các ký tự chính quy chịu trách nhiệm về kết quả trên:

‘^[abcd]’ : dấu mũ (^) có nghĩa là khớp mẫu nên được áp dụng ở vị trí đầu và charlist [abcd] có nghĩa là chỉ các tiêu đề phim bắt đầu bằng a,b,c hoặc d mới được trả về trong tập kết quả.

Sửa đổi câu lệnh trên và sử dụng NOT charlist (hiển thị danh sách phim mà tiêu đề phim không bắt đầu bằng các ký tự có trong charlist) để xem kết quả :

‘^[^abcd]’ : dấu mũ (^) có nghĩa là khớp mẫu nên được áp dụng ở vị trí đầu tiên và charlist [^abcd] có nghĩa là những bộ phim có tiêu đề bắt đầu với bất kỳ ký tự a,b,c, hoặc d nào cũng đều sẽ bị loại khỏi tập kết quả trả về

Meta-characters trong biểu thức chính quy

Những gì chúng ta vừa xem xét ở trên là hình thức đơn giản nhất của biểu thức chính quy. Bây giờ hãy xem xét các khớp mẫu biểu thức chính quy tiên tiến hơn. Giả sử chúng ta muốn tìm kiếm những tựa phim với mẫu “code” và chỉ sử dụng biểu thức chính quy, chúng ta sẽ làm thế nào? Câu trả lời đó chính là meta-charecters. Chúng cho phép chúng ta hiệu chỉnh kết quả tìm kiếm mẫu bằng cách sử dụng biểu thức chính quy.

Ký tựMô tảVí dụ
*Dấu hoa thị (*) được sử dụng để khớp với 0 hoặc nhiều lần xuất hiện của mẫu trong chuỗi.SELECT * FROM movies WHERE title REGEXP ‘da*’; sẽ trả về tất cả các phim có tiêu đề có chứa ký tự “da”. Ví dụ: Da Vinci Code , Daddy’s Little Girls. 
+Dấu cộng (+) được sử dụng để khớp một hoặc nhiều lần xuất hiện của mẫu trong chuỗi.SELECT * FROM `movies` WHERE `title` REGEXP ‘mon+’; sẽ trả về tất cả các phim có tiêu đề chứa ký tự “mon”. Ví dụ: Angels and Demons. 
?Dấu hỏi (?) được dùng để khớp với 0 hoặc một lần xuất hiện của mẫu trong chuỗi.SELECT * FROM `categories` WHERE `category_name` REGEXP ‘com?’;  sẽ trả về tất cả các thể loại phim có chứa ký tự “com”. Ví dụ: comedy , romantic comedy.
.Dấu chấm (.) được dùng để khớp với bất kỳ ký tự đơn nào trừ dấu xuống dòngSELECT * FROM movies WHERE `year_released` REGEXP ‘200.’; sẽ trả về tất cả các phim có năm phát hành bắt đầu bằng ký tự “200” và theo sau bởi bất kỳ ký tự nào. Ví dụ: 2005, 2007, 2008,…
[abc]Charlist [abc] được sử dụng để khớp bất kỳ ký tự nào trong dấu ngoặc vuông [ ]SELECT * FROM `movies` WHERE `title` REGEXP ‘[vwxyz]’; sẽ trả về tất cả các phim có tiêu đề chứa bất kỳ ký tự nào trong “vwxyz”. Ví dụ: X-Men, Da Vinci Code, …  
[^abc]Charlist [^abc] được sử dụng để khớp với bất kỳ ký tự nào không có trong dấu ngoặc vuông [ ]SELECT * FROM `movies` WHERE `title` REGEXP ‘^[^vwxyz]’; sẽ trả về danh sách tất cả các phim có tiêu đề chứa các ký tự khác với các ký tự trong “vwxyz”.
[A-Z][A-Z] được sử dụng để khớp với bất kỳ chữ in hoa nàoSELECT * FROM `members` WHERE `postal_address` REGEXP ‘[A-Z]’; sẽ trả về tất cả thành viên có địa chỉ chứa bất kỳ ký tự nào từ A-Z. Ví dụ: Janet Jones với mã số thành viên là 1.
[a-z][a-z] được sử dụng để khớp với bất kỳ chữ thường nàoSELECT * FROM `members` WHERE `postal_address` REGEXP ‘[a-z]’; sẽ trả về tất cả các thành viên có địa chị chứa bất kỳ ký tự nào từ a đến z. Ví dụ: Janet Jones với mã số thành viên là 1.
[0-9][0-9] được sử dụng để khớp với bất kỳ chữ số nào từ 0 đến 9.SELECT * FROM `members` WHERE `contact_number` REGEXP ‘[0-9]’  sẽ trả về tất cả các thành viên có số liên lạc có chứa các ký tự “[0-9]” .Ví dụ:  Robert Phil.
^Dấu mũ (^) được sử dụng để bắt đầu khớp tại vị trí đầu tiên.SELECT * FROM `movies` WHERE `title` REGEXP ‘^[cd]’; trả về tất cả các phim có tiêu đề bắt đầu bằng bất kỳ ký tự nào trong “cd”. Ví dụ: Code Name Black, Daddy’s Little Girls và Da Vinci Code.
|Thanh dọc (|) được sử dụng cho điều kiện hoặc.SELECT * FROM `movies` WHERE `title` REGEXP ‘^[cd]|^[u]’; trả về tất cả các phim có tự đề bắt đầu bằng bất kỳ ký tự nào trong “cd” hoặc “u”. Ví dụ: Code Name Black, Daddy’s Little Girl, Da Vinci Code và Underworld – Awakening.
[[:<:]][[:<:]] khớp với các từ đầu tiên.SELECT * FROM `movies` WHERE `title` REGEXP ‘[[:<:]]for’; trả về tất cả các phim có tiêu đề bắt đầu bằng ký tự “for”. Ví dụ:  Forgetting Sarah Marshal.
[[:>:]][[:>:]] khớp với các từ cuốiSELECT * FROM `movies` WHERE `title` REGEXP ‘ack[[:>:]]’;  trả về tất cả các phim có tiêu đề kết thúc bằng “ack” . Ví dụ: Code Name Black.
[:class:][:class:] khớp với một lớp ký tự. Tức là [:alpha:] để khớp với chữ cái, [:space:] để khớp với khoảng trắng, [:punct:] để khớp với dấu chấm và [:upper:] để khớp với chữ in hoa. SELECT * FROM `movies` WHERE `title` REGEXP ‘[:alpha:]’; trả về tất cả các phim có tiêu đề chỉ chứa các chữ cái. Ví dụ: Forgetting Sarah Marshal, X-Men,… Bộ phim như Pirates of the Caribbean 4 sẽ bị bỏ qua bởi truy vấn này.

Dấu gạch chéo (\) được sử dụng để làm ký tự thoát, dùng để thoát khỏi ký tự tiếp theo. Nếu chúng ta muốn sử dụng nó như một phần của mẫu trong biểu thức chính quy, chúng ta nên sử dụng dấu gạch chéo kép (\\).

Tổng kết

  • Biểu thức chính quy cung cấp một cách khớp mẫu mạnh mẽ và linh hoạt, có thể giúp chúng ta triển khai các tiện ích tìm kiếm mạnh mẽ cho hệ thống cơ sở dữ liệu.
  • REGEXP là toán tử được sử dụng khi thực hiện khớp mẫu biểu thức chính quy. RLIKE cũng có thể được sử dụng thay cho REGEXP.
  • Biểu thức chính quy hỗ trợ một số ký tự meta-characters cho phép chúng ta linh hoạt và kiểm soát hơn khi thực hiện khớp mẫu
  • Dấu gạch chéo (\) được sử dụng như một ký tự thoát trong biểu thức chính quy. Nó chỉ được xem xét như một phần của mẫu nếu như dấu gạch chéo kép (\\) được sử dụng
  • Biểu thức chính quy không phân biệt chữ hoa và chữ thường.

Ngoài ra bạn có thể truy cập ngay https://gitiho.com/ để tìm hiểu thêm nhiều các khóa học hay về tin học văn phòng: Excel, Power Point, lập trình VBA, lập trình C#, SQL, thiết kế đồ họa… Có rất nhiều ưu đãi hấp dẫn đang chờ bạn.

Các bạn có thể tham khảo thêm các bài viết khác về cách sử dụng MySQL:

Hướng dẫn sử dụng câu lệnh SELECT trong MySQL qua các ví dụ

Hướng dẫn câu lệnh DELETE trong MySQL và ví dụ minh họa

Hướng dẫn cách dùng mệnh đề WHERE trong MySQL

Đánh giá bài viết này

Cùng tham gia cộng đồng hỏi đáp về chủ đề Góc chia sẻ

Thảo luận 0 câu trả lời
Lượt xem 1767 lượt xem
Vỗ tay vỗ tay

0 Bình luận

@ 2020 - Bản quyền của Công ty cổ phần công nghệ giáo dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở kế hoạch và đầu tư TP. Hà Nội