Sử dụng toán tử regexp trong MySQL

Chúng ta đều biết thao tác cơ bản nhất khi làm việc với SQL đó là sử dụng để truy vấn dữ liệu (query). Các câu query được tạo ra với mục đích lấy được dữ liệu mà ta mong muốn. Các dữ liệu này thường gắn theo những điều kiện nhất định. Những điều kiện này có thể cụ thể hoặc không. Để vấn đề đơn giản hơn, tôi sẽ lấy 1 ví dụ. Tôi có một table chứa thông tin của sinh viên gồm: tên, tuổi, địa chỉ, ngành học ... Giờ tôi cầu tạo ra 1 câu query để lấy ra những người có tên bằng "Nguyen Van An": select * from student_table where name = 'Nguyen Van An'; Câu query này rất đơn giản bởi tôi đã biết chính xác dữ liệu mà tôi mong muốn. Tuy nhiên yêu cầu có chút thay đổi, tôi tăng độ khó của câu query lên một chút, đó là tôi cần những người có tên là Nam select * from student_table where name like '%Nam'; Toán tử "like" được sử dụng trong hoàn cảnh này. Nó tỏ hữu dụng và chúng là có thể sử dụng nó trong rất nhiều trường hợp để tìm kiếm. Nhưng nếu có 1 yêu cầu mới là cần tìm tất cả những bạn sinh viên mà trong địa chỉ có từ "Ha Noi" xuất hiện 2 lần trở lên. Với yêu cầu này chắc chúng ta không thể sử dụng toán tử like được rồi, vậy phải làm sao ??? Để giải quyết vấn đề đó, toán tử REGEXP xuất hiên, đây chính là Regular Expression được sử dụng để xử lý các vấn đề liên quan đến chuỗi trong Mysql. Nó rất mạnh mẽ và linh động. -- Cú pháp: select * from student_table where address regexp "[Ha Noi]{2,}"; Trong đó regexp là keyword, "[Ha Noi]{2,}" là pattern đặc tả dữ liệu mà ta mong muốn tìm kiếm. Bảng dưới đây sẽ liệt kê các ký hiệu Regular Expression được sử dụng trong truy vấn dữ liệu: 1 ^ Tìm kiếm giá trị từ đầu chuỗi nguồn 2 $ Tìm kiếm giá trị từ cuối chuỗi nguồn 3 . Đại diện cho một ký tự bất ký 4 * 0 hoặc nhiều lần xuất hiện 5 + 1 hoặc nhiều lần xuất hiện 6 ? 0 hoặc 1 lần xuất hiện 7 | Sự lựa chọn 8 {n,m} Số lần xuất hiện của ký tự từ n đến m lần

Từ các kí hiệu này ta có thể tạo ra được các pattern map với dữ liệu ta mong muốn.

  • "^A" hoặc "A$" nếu muốn tìm một cái gì đó bắt đầu hoặc kết thúc bằng kí tự "A".
  • "[A|B]" tìm kiếm cái gì đó mà có chữ A hoặc B.
  • .... Và còn rất nhiều pattern khác nữa mà bạn có thể tạo ra để phù hợp với yêu cầu truy vấn.

Chú ý, nếu bạn muốn truy vấn ra những giá trị có ý nghĩa phủ định với regexp thì ta có thể thêm toán tử "NOT" câu query: select * from student_table where name not regexp "[Nam$]"; Câu query trên có nghĩa là tìm ra những sinh viên có tên mà không phải kết thúc cuối cùng là Nam. Regexp thực sự rất hữu ích và đặc biệt phù hợp cho những yêu cầu cần verify dữ liệu. Các bạn nên tìm hiểu và nếu có thể hãy sử dụng nó thường xuyên.