MySQL - Biểu thức chính quy

Xin chào các bạn yêu thích cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới fascinante của MySQL Biểu thức chính quy. Đừng lo lắng nếu bạn chưa bao giờ viết mã trước đây - chúng ta sẽ bắt đầu từ cơ bản và dần dần nâng cao. Cuối cùng của bài hướng dẫn này, bạn sẽ sử dụng biểu thức chính quy như một chuyên gia!

MySQL - Regular Expressions

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

Trước khi chúng ta nhảy vào các chi tiết cụ thể của MySQL, hãy hiểu biểu thức chính quy (regex) là gì. Hãy tưởng tượng bạn đang cố gắng tìm một mẫu cụ thể trong một đống văn bản. Đó là nơi mà regex rất hữu ích! Nó giống như một công cụ tìm kiếm siêu mạnh có thể tìm thấy các mẫu phức tạp trong các chuỗi.

Biểu thức chính quy trong MySQL

Trong MySQL, chúng ta sử dụng toán tử REGEXP để làm việc với biểu thức chính quy. Nó tương tự như toán tử LIKE nhưng mạnh mẽ hơn nhiều.

Cú pháp cơ bản

Dưới đây là cú pháp cơ bản:

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP 'pattern';

Hãy xem một số ví dụ:

SELECT * FROM employees WHERE last_name REGEXP 'son';

Truy vấn này sẽ tìm tất cả nhân viên có họ chứa 'son', như Johnson, Wilson hoặc Sonny.

Cảm biến chữ hoa/chữ thường

Mặc định, regex của MySQL không phân biệt chữ hoa/chữ thường. Nếu bạn muốn khớp theo cảm biến chữ hoa/chữ thường, hãy sử dụng từ khóa BINARY:

SELECT * FROM employees WHERE last_name REGEXP BINARY 'Smith';

Truy vấn này sẽ khớp với 'Smith' nhưng không khớp với 'smith' hoặc 'SMITH'.

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

Bây giờ, hãy cùng khám phá một số mẫu thường gặp sử dụng với REGEXP. Tôi thích gọi chúng là "mã bí mật" của regex - một khi bạn biết chúng, bạn có thể tìm thấy gần như bất kỳ thứ gì!

^ (Dấu phẩy ngang) - Đầu của chuỗi

Dấu phẩy ngang khớp với mẫu ở đầu của chuỗi.

SELECT * FROM products WHERE product_name REGEXP '^Apple';

Truy vấn này tìm tất cả các sản phẩm có tên bắt đầu bằng 'Apple', như 'Apple iPhone' hoặc 'Apple MacBook'.

$ (Dấu dollar) - Cuối của chuỗi

Dấu dollar khớp với mẫu ở cuối của chuỗi.

SELECT * FROM products WHERE product_name REGEXP 'Pro$';

Truy vấn này tìm các sản phẩm kết thúc bằng 'Pro', như 'MacBook Pro' hoặc 'iPad Pro'.

. (Dấu chấm) - Bất kỳ ký tự nào

Dấu chấm khớp với bất kỳ ký tự nào ngoại trừ ký tự mới dòng.

SELECT * FROM words WHERE word REGEXP 'c.t';

Truy vấn này khớp với các từ như 'cat', 'cut' hoặc thậm chí 'c@t'!

* (Dấu sao) - Không hoặc nhiều lần xuất hiện

Dấu sao khớp với không hoặc nhiều lần xuất hiện của ký tự trước đó.

SELECT * FROM emails WHERE email REGEXP 'info.*@example.com';

Truy vấn này khớp với các email như '[email protected]', '[email protected]' hoặc thậm chí '[email protected]'.

+ (Dấu cộng) - Một hoặc nhiều lần xuất hiện

Tương tự như *, nhưng yêu cầu ít nhất một lần xuất hiện.

SELECT * FROM products WHERE product_name REGEXP 'iPad ?Pro+';

Truy vấn này khớp với 'iPad Pro', 'iPad Pro', 'iPad Pro', v.v.

? (Dấu hỏi) - Không hoặc một lần xuất hiện

Dấu hỏi làm cho ký tự trước đó trở thành tùy chọn.

SELECT * FROM words WHERE word REGEXP 'colou?r';

Truy vấn này khớp cả 'color' và 'colour'.

[] (Dấu ngoặc vuông) - Tập ký tự

Dấu ngoặc vuông xác định một tập ký tự để khớp.

SELECT * FROM employees WHERE last_name REGEXP '[AEIOU]';

Truy vấn này tìm các họ chứa bất kỳ nguyên âm nào.

[^] (Tập ký tự bị否定)

Thêm dấu phẩy ngang bên trong ngoặc vuông để否定 tập.

SELECT * FROM products WHERE product_name REGEXP '[^0-9]';

Truy vấn này tìm các tên sản phẩm không chứa bất kỳ chữ số nào.

| (Dấu gạch dọc) - Phép hoặc

Dấu gạch dọc hoạt động như một toán tử OR.

SELECT * FROM animals WHERE species REGEXP 'cat|dog';

Truy vấn này tìm tất cả các con mèo và con chó trong bảng động vật của chúng ta.

Các hàm và toán tử biểu thức chính quy

MySQL cung cấp nhiều hàm và toán tử để làm việc với biểu thức chính quy. Hãy cùng khám phá chúng:

Hàm/Toán tử Mô tả
REGEXP Khớp một chuỗi với biểu thức chính quy
REGEXP_LIKE() Trả về 1 nếu chuỗi khớp với mẫu regex, 0 ngược lại
REGEXP_INSTR() Trả về vị trí bắt đầu của khớp regex đầu tiên
REGEXP_REPLACE() Thay thế các substrings khớp với mẫu regex
REGEXP_SUBSTR() Trả về substring khớp với mẫu regex

Hãy xem một số ví dụ:

REGEXP_LIKE()

SELECT * FROM products WHERE REGEXP_LIKE(product_name, '^iPhone');

Truy vấn này tìm tất cả các sản phẩm có tên bắt đầu bằng 'iPhone'.

REGEXP_INSTR()

SELECT email, REGEXP_INSTR(email, '@') AS at_position
FROM users;

Truy vấn này trả về vị trí của ký tự '@' trong mỗi địa chỉ email.

REGEXP_REPLACE()

SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '*') AS vowels_replaced;

Truy vấn này thay thế tất cả các nguyên âm bằng dấu sao, trả về 'Hll, W*rld!'.

REGEXP_SUBSTR()

SELECT REGEXP_SUBSTR('[email protected]', '[^@]+') AS username;

Truy vấn này trích xuất phần tên người dùng của địa chỉ email.

Kết luận

Chúc mừng! Bạn đã vừa bước những bước đầu tiên vào thế giới mạnh mẽ của MySQL biểu thức chính quy. Nhớ rằng, thực hành là cách tốt nhất để trở thành chuyên gia. Hãy thử tạo ra các mẫu regex của riêng bạn và thử nghiệm với các kết hợp khác nhau.

Trong hành trình của bạn, bạn sẽ thấy rằng regex giống như một cây đa năng trong bộ công cụ cơ sở dữ liệu của bạn. Nó có thể sẽ khó khăn ban đầu, nhưng một khi bạn thành thạo, bạn sẽ tự hỏi làm thế nào bạn từng quản lý mà không có nó!

Chúc bạn may mắn và các truy vấn của bạn luôn trả về kết quả mà bạn mong muốn!

Credits: Image by storyset