Toán tử REGEXP trong MySQL

Toán tử REGEXP trong MySQL
Toán tử REGEXP trong MySQL

Chức năng của Toán tử REGEXP trong MySQL

Toán tử REGEXP trong MySQL dùng để kiểm tra một chuỗi có chứa các ký tự ở nhiều vị trí hay không hoặc có đúng cấu trúc cần lấy hay không.

Các biểu thức của toán tử REGEXP trong MySQL

Biểu thức Chức năng
^ Tìm chuỗi có vị trí đầu chuỗi khớp với từ khóa
$ Tìm chuỗi có vị trí cuối chuỗi khớp với từ khóa
. Khớp với bất kỳ ký tự nào
* Khớp với 0 ký tự đứng trước nó hoặc khớp với bất ký ký tự đứng trước nó
bt1|bt2|bt3 Tìm chuỗi thỏa điều kiện của biểu thức 1 hoặc thỏa điều kiện biểu thức 2 hoặc thỏa điều kiện biểu thức 3
[....] Khớp với bất kỳ ký tự nào nằm trong dấu ngoặc vuông.
{n} Quy định số ký tự được thể hiện của phần tử ở trước
+ Khớp với một hoặc nhiều ký tự đứng trước nó

Code các biểu thức của toán tử REGEXP trong MySQL

Biểu thức ^ trong toán tử REGEXP

Dùng để tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa cần tìm.

Ví dụ: Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd

select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức ^ trong toán tử REGEXP
   // Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd
   echo "<b>Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd</b><br>";
   $sql = "select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd
ten: Trần Thị Vân
msnv : pkd0609nu
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
--------------------------------

Biểu thức $ trong toán tử REGEXP

Ví dụ: Tìm kiếm chuỗi có vị trí cuối chuỗi khớp với từ khóa nu

select ten,msnv from tb_nhanvien where msnv REGEXP 'nu$';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức $ trong toán tử REGEXP
   // Tìm kiếm chuỗi có vị trí cuối chuỗi khớp với từ khóa nu
   echo "<b>Tìm kiếm chuỗi có vị trí cuối chuỗi khớp với từ khóa nu</b><br>";
   $sql = "select ten,msnv from tb_nhanvien where msnv REGEXP 'nu$'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có vị trí cuối chuỗi khớp với từ khóa nu
ten: Trần Thị Vân
msnv : pkd0609nu
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
--------------------------------

Biểu thức * kết hợp . trong toán tử REGEXP

Ví dụ: Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd và vị trí cuối chuỗi khớp với từ khóa nu, ví trị giữa chuỗi khớp với bất kỳ ký tự nào

select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd.*nu$';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức * kết hợp . trong toán tử REGEXP
   // Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd và vị trí cuối chuỗi khớp với từ khóa nu, ví trị giữa chuỗi khớp với bất kỳ ký tự nào
   echo "<b>Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd và vị trí cuối chuỗi khớp với từ khóa nu, ví trị giữa chuỗi khớp với bất kỳ ký tự nào</b><br>";
   $sql = "select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd.*nu$'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd và vị trí cuối chuỗi khớp với từ khóa nu, ví trị giữa chuỗi khớp với bất kỳ ký tự nào
ten: Trần Thị Vân
msnv : pkd0609nu
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
--------------------------------

Biểu thức | trong toán tử REGEXP

Ví dụ: Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd hoặc vị trí cuối chuỗi khớp với từ khóa nam

select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd|nam$';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức | trong toán tử REGEXP
   // Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd hoặc vị trí cuối chuỗi khớp với từ khóa nam
   echo "<b>Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd hoặc vị trí cuối chuỗi khớp với từ khóa nam</b><br>";
   $sql = "select ten,msnv from tb_nhanvien where msnv REGEXP '^pkd|nam$'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có vị trí đầu chuỗi khớp với từ khóa pkd hoặc vị trí cuối chuỗi khớp với từ khóa nam
ten: Trần Thị Vân
msnv : pkd0609nu
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
--------------------------------
ten: Bùi Tấn Lực
msnv : pkt2702nam
--------------------------------

Biểu thức [...] kết hợp {n} trong toán tử REGEXP

Ví dụ: Tìm kiếm chuỗi có cấu trúc nnnn-nnn-nnn

select sodienthoai,ten,msnv from tb_nhanvien where sodienthoai REGEXP '[0-9]{4}-[0-9]{3}-[0-9]{3}';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức [...] kết hợp {n} trong toán tử REGEXP
   // Tìm kiếm chuỗi có cấu trúc nnnn-nnn-nnn
   echo "<b>Tìm kiếm chuỗi có cấu trúc nnnn-nnn-nnn</b><br>";
   $sql = "select sodienthoai,ten,msnv from tb_nhanvien where sodienthoai REGEXP '[0-9]{4}-[0-9]{3}-[0-9]{3}'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "sodienthoai : {$row['sodienthoai']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có cấu trúc nnnn-nnn-nnn
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
sodienthoai : 0398-200-200
--------------------------------
ten: Bùi Tấn Lực
msnv : pkt2702nam
sodienthoai : 0398-259-259
--------------------------------

Biểu thức [...] trong toán tử REGEXP

Biểu thức này dùng để kiểm tra một cột có chứa những ký tự trong dấu ngoặc vuông không, mỗi ký tự trong dấu ngoặc vuông đều độc lập.

Ví dụ: Tìm kiếm chuỗi có ký tự u

select sodienthoai,ten,msnv from tb_nhanvien where msnv REGEXP '[u]';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức [...] trong toán tử REGEXP
   // Tìm kiếm chuỗi có ký tự u
   echo "<b>Tìm kiếm chuỗi có ký tự u</b><br>";
   $sql = "select sodienthoai,ten,msnv from tb_nhanvien where msnv REGEXP '[u]'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "sodienthoai : {$row['sodienthoai']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có cấu trúc nnnn-nnn-nnn
ten: Trần Thị Vân
msnv : pkd0609nu
sodienthoai : 039-333-4444
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
sodienthoai : 0398-200-200
--------------------------------

Biểu thức + trong toán tử REGEXP

Ví dụ: Tìm kiếm chuỗi có chứa 1 trong các ký tự ua

select sodienthoai,ten,msnv from tb_nhanvien where msnv REGEXP '[ua+]';
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Biểu thức + trong toán tử REGEXP
   // Tìm kiếm chuỗi có chứa 1 trong các ký tự ua
   echo "<b>Tìm kiếm chuỗi có chứa 1 trong các ký tự ua</b><br>";
   $sql = "select sodienthoai,ten,msnv from tb_nhanvien where msnv REGEXP '[ua+]'";
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ten: {$row['ten']} <br> ".
         "msnv : {$row['msnv']} <br> ".
         "sodienthoai : {$row['sodienthoai']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Tìm kiếm chuỗi có chứa 1 trong các ký tự ua
ten: Trần Thị Vân
msnv : pkd0609nu
sodienthoai : 039-333-4444
--------------------------------
ten: Nguyễn Thùy Dung
msnv : pkd2910nu
sodienthoai : 0398-200-200
--------------------------------
ten: Bùi Tấn Lực
msnv : pkt2702nam
sodienthoai : 0398-259-259
--------------------------------

Ứng dụng REGEXP để lọc dữ liệu thực tế trong MySQL

REGEXP phát huy hiệu quả khi dữ liệu cần tìm không có một từ khóa cố định mà phải đáp ứng một mẫu ký tự. Thay vì kiểm tra từng trường hợp riêng lẻ, bạn có thể xây dựng một biểu thức để lọc email, số điện thoại, mã sản phẩm, tên người dùng hoặc các chuỗi có cấu trúc đặc biệt.

Lọc dữ liệu theo định dạng bằng REGEXP

Khi một cột chứa dữ liệu theo cùng một quy tắc, REGEXP có thể giúp tìm đúng những bản ghi phù hợp với định dạng đó. Chẳng hạn, với mã sản phẩm bắt đầu bằng SP và tiếp theo là 4 chữ số, có thể dùng ^ để cố định vị trí đầu chuỗi và [0-9]{4} để quy định số lượng chữ số.

SELECT ma_san_pham, ten_san_pham
FROM san_pham
WHERE ma_san_pham REGEXP '^SP[0-9]{4}$';

Việc kết hợp ^$ giúp kiểm tra toàn bộ chuỗi thay vì chỉ xác định xem bên trong dữ liệu có xuất hiện một đoạn ký tự phù hợp hay không. Đây là cách hữu ích khi cần phát hiện dữ liệu nhập sai định dạng.

Kiểm tra số điện thoại và chuỗi ký tự bằng REGEXP

REGEXP có thể dùng để rà soát những dữ liệu có cấu trúc rõ ràng như số điện thoại. Ví dụ, nếu dữ liệu được lưu dưới dạng 10 chữ số và bắt đầu bằng số 0, biểu thức dưới đây sẽ chỉ lấy những giá trị đáp ứng đủ điều kiện.

SELECT id, ho_ten, so_dien_thoai
FROM khach_hang
WHERE so_dien_thoai REGEXP '^0[0-9]{9}$';

Cách kiểm tra này phù hợp khi cần tìm các bản ghi có dữ liệu không đúng quy ước trước khi chuẩn hóa hoặc xử lý tiếp. Với dữ liệu thực tế, nên xác định rõ định dạng được phép trước khi xây dựng biểu thức để tránh loại bỏ những giá trị hợp lệ.

Tìm dữ liệu theo nhiều điều kiện với REGEXP

Một biểu thức có thể chứa nhiều khả năng tìm kiếm thông qua |. Điều này đặc biệt hữu ích khi cần lấy dữ liệu thuộc một trong nhiều nhóm có cùng mục đích xử lý.

SELECT id, ten_danh_muc, ma_danh_muc
FROM danh_muc
WHERE ma_danh_muc REGEXP '^SP|^DV|^KM';

Trong ví dụ trên, MySQL sẽ tìm những mã bắt đầu bằng SP, DV hoặc KM. Nếu điều kiện phức tạp hơn, nên dùng dấu ngoặc để nhóm các lựa chọn nhằm làm biểu thức dễ đọc và hạn chế hiểu sai ý định tìm kiếm.

Kết hợp REGEXP với mệnh đề WHERE để truy vấn chính xác hơn

REGEXP không nhất thiết phải là điều kiện duy nhất trong câu lệnh. Có thể kết hợp nó với các điều kiện khác trong WHERE để thu hẹp tập dữ liệu trước khi trả về kết quả.

SELECT id, ho_ten, email
FROM khach_hang
WHERE trang_thai = 1
  AND email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+[.][A-Za-z]{2,}$';

Cách viết này giúp truy vấn đồng thời kiểm tra trạng thái bản ghi và cấu trúc email. Khi có nhiều điều kiện, nên đặt mỗi điều kiện trên một dòng để dễ kiểm tra, thay đổi và bảo trì câu lệnh SQL.

Khi nào nên dùng REGEXP thay cho LIKE trong MySQL

LIKE phù hợp với những mẫu tìm kiếm đơn giản, chẳng hạn kiểm tra chuỗi bắt đầu, kết thúc hoặc chứa một từ khóa. Trong khi đó, REGEXP thích hợp hơn khi điều kiện cần mô tả nhiều quy tắc như tập ký tự, số lượng ký tự, nhiều khả năng thay thế hoặc cấu trúc của toàn bộ chuỗi.

Trường hợp Nên sử dụng
Tìm chuỗi chứa một từ khóa cố định LIKE
Tìm chuỗi bắt đầu hoặc kết thúc theo mẫu đơn giản LIKE hoặc REGEXP
Kiểm tra nhiều loại ký tự trong cùng một mẫu REGEXP
Kiểm tra số lượng và vị trí ký tự REGEXP
Xác định dữ liệu có đúng một cấu trúc cụ thể hay không REGEXP

Do phải xử lý biểu thức chính quy, REGEXP có thể phức tạp hơn LIKE và không nên dùng khi một điều kiện LIKE đơn giản đã đáp ứng được yêu cầu. Với truy vấn trên bảng lớn, nên kiểm tra hiệu năng thực tế và tránh xây dựng biểu thức quá phức tạp không cần thiết.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết Toán tử REGEXP trong MySQL.

Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.

  • 0 Bình luận
Trần Thị Vân | Content Creator Web Mới
Trần Thị Vân
Trần Thị Vân là Content Creator tại Web Mới, phụ trách nghiên cứu, biên soạn nội dung và chia sẻ kiến thức về website, SEO, lập trình cùng các xu hướng công nghệ
Đánh giá
Chia sẻ nội dung đánh giá của bạn về Toán tử REGEXP trong MySQL
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Yêu Cầu Báo Giá
Gửi trang web mẫu cần làm theo, chúng tôi sẽ báo giá đến bạn từ Email (tanlucit09@gmail.com - Bùi Tấn Lực) hoặc Zalo (Lực IT - 0398259259) !