Toán tử REGEXP trong MySQL
Trần Thị Vân
- 1173
- 19/08/2025
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 ^ và $ 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
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 *