Sử dụng toán tử
mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 và mẫu biểu thức chính quy, được mô tả trong phần này. Hoặc sử dụng mẫu SQL, được mô tả trong Công thức 4. 7Các mẫu SQL [xem Công thức 4. 7] có khả năng được triển khai bởi các hệ thống cơ sở dữ liệu khác, vì vậy chúng có thể di động hợp lý ngoài MySQL. Mặt khác, chúng có phần hạn chế. Ví dụ: bạn có thể dễ dàng viết một mẫu SQL
mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
3 để tìm các chuỗi chứa mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
4, nhưng bạn không thể viết một mẫu SQL duy nhất để xác định các chuỗi chứa bất kỳ ký tự nào trong số các ký tự mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
5, mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
6 hoặc mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
7. Bạn cũng không thể khớp nội dung chuỗi dựa trên các loại ký tự như chữ cái hoặc chữ số. Đối với các hoạt động như vậy, MySQL hỗ trợ một loại hoạt động khớp mẫu khác dựa trên biểu thức chính quy và toán tử mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 [hoặc mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
9 mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 để đảo ngược ý nghĩa của khớp]. [] Kết hợp mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 sử dụng một tập hợp các phần tử mẫu khác với mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
2 và mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
3 [cả hai phần tử này đều không có gì đặc biệt trong biểu thức chính quy]Mẫu
Những gì mô hình phù hợp
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
4bắt đầu chuỗi
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
5Kết thúc chuỗi
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
6Bất kỳ ký tự đơn nào
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
7Bất kỳ ký tự nào được liệt kê giữa các dấu ngoặc vuông
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
8Bất kỳ ký tự nào không được liệt kê giữa các dấu ngoặc vuông
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
9_______18_______0mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
1mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
0mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
3Luân phiên;
mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
7Không hoặc nhiều phiên bản của phần tử trước
mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
8Một hoặc nhiều trường hợp của phần tử trước
mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
9mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
0mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
1mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
0 trường hợp của phần tử trướcmysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
9mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
4mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
5mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
0mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
1Các trường hợp của phần tử trước
mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
4 đến mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
0Bạn có thể đã quen thuộc với các ký tự mẫu biểu thức chính quy này, bởi vì nhiều ký tự trong số chúng giống với các ký tự được sử dụng bởi vi, grep, sed và các tiện ích Unix khác hỗ trợ biểu thức chính quy. Hầu hết chúng cũng được sử dụng trong các biểu thức chính quy được hiểu bởi Perl, PHP và Python. [Ví dụ, Chương 10 thảo luận về khớp mẫu trong tập lệnh Perl. ] Đối với Java, các thư viện lớp Jakarta ORO hoặc Regexp cung cấp các khả năng đối sánh cũng sử dụng các ký tự này
Phần trước về các mẫu SQL đã chỉ ra cách khớp các chuỗi con ở đầu hoặc cuối chuỗi hoặc ở một vị trí tùy ý hoặc cụ thể trong một chuỗi. Bạn có thể làm những điều tương tự với các biểu thức thông thường
Các chuỗi bắt đầu bằng một chuỗi con cụ thể
mysql>
SELECT name FROM metal WHERE name REGEXP '^co';
+--------+ | name | +--------+ | copper | +--------+Các chuỗi kết thúc bằng một chuỗi con cụ thể
mysql>
SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+ | name | +--------+ | copper | | silver | +--------+Các chuỗi chứa một chuỗi con cụ thể tại bất kỳ vị trí nào
mysql>
SELECT name FROM metal WHERE name REGEXP 'er';
+---------+ | name | +---------+ | copper | | mercury | | silver | +---------+Các chuỗi chứa một chuỗi con cụ thể tại một vị trí cụ thể
mysql>
SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+ | name | +--------+ | copper | +--------+
Ngoài ra, các biểu thức chính quy có các khả năng khác và có thể thực hiện các loại đối sánh mà các mẫu SQL không thể thực hiện được. Ví dụ: biểu thức chính quy có thể chứa các lớp ký tự, khớp với bất kỳ ký tự nào trong lớp
Để viết một lớp ký tự, hãy liệt kê các ký tự bạn muốn lớp khớp với bên trong dấu ngoặc vuông. Do đó, mẫu
0 khớp vớialternative1
|alternative2
|...mysql>
5,SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+ | name | +--------+ | copper | | silver | +--------+mysql>
6 hoặcSELECT name FROM metal WHERE name REGEXP 'er$';
+--------+ | name | +--------+ | copper | | silver | +--------+mysql>
7SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+ | name | +--------+ | copper | | silver | +--------+Các lớp có thể biểu thị phạm vi ký tự bằng cách sử dụng dấu gạch ngang giữa đầu và cuối phạm vi.
4 khớp với bất kỳ chữ cái nào,alternative1
|alternative2
|...
5 khớp với chữ số vàalternative1
|alternative2
|...
6 khớp với chữ cái hoặc chữ sốalternative1
|alternative2
|...Để phủ định một lớp ký tự [“khớp bất kỳ ký tự nào ngoại trừ những ký tự này”], hãy bắt đầu danh sách bằng ký tự
mysql>
4. Ví dụ:SELECT name FROM metal WHERE name REGEXP 'er';
+---------+ | name | +---------+ | copper | | mercury | | silver | +---------+
8 khớp với mọi thứ trừ chữ sốalternative1
|alternative2
|...
Các khả năng biểu thức chính quy của MySQL cũng hỗ trợ các lớp ký tự POSIX. Các bộ ký tự cụ thể này khớp với nhau, như được mô tả trong bảng sau
lớp POSIX
Những gì lớp học phù hợp
9alternative1
|alternative2
|...
Ký tự chữ cái và số
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
0Ký tự chữ cái
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
1Khoảng trắng [dấu cách hoặc ký tự tab]
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
2Ký tự điều khiển
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
3chữ số
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
4Ký tự đồ họa [không trống]
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
5Ký tự chữ thường
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
6Ký tự đồ họa hoặc khoảng trắng
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
7ký tự chấm câu
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
8Dấu cách, tab, xuống dòng, xuống dòng
mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
9Ký tự chữ hoa
mysql> SELECT '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$';
+-------------------------------------------+
| '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
0Chữ số thập lục phân [_______62_______1,
mysql> SELECT '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$';
+-------------------------------------------+
| '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
2, mysql> SELECT '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$';
+-------------------------------------------+
| '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
3]Các lớp POSIX được thiết kế để sử dụng trong các lớp ký tự, vì vậy bạn sử dụng chúng trong dấu ngoặc vuông. Biểu thức sau khớp với các giá trị chứa bất kỳ ký tự chữ số thập lục phân nào
mysql> SELECT name, name REGEXP '[[:xdigit:]]' FROM metal;
+----------+----------------------------+
| name | name REGEXP '[[:xdigit:]]' |
+----------+----------------------------+
| copper | 1 |
| gold | 1 |
| iron | 0 |
| lead | 1 |
| mercury | 1 |
| platinum | 1 |
| silver | 1 |
| tin | 0 |
+----------+----------------------------+
Biểu thức chính quy có thể chứa các thay thế. Cú pháp trông như thế này
alternative1
|alternative2
|...
Một thay thế tương tự như một lớp ký tự theo nghĩa là nó khớp nếu bất kỳ lựa chọn thay thế nào khớp. Nhưng không giống như một lớp ký tự, các lựa chọn thay thế không giới hạn ở các ký tự đơn lẻ—chúng có thể là các chuỗi hoặc thậm chí là các mẫu. Ví dụ: sự thay thế sau khớp với các chuỗi bắt đầu bằng một nguyên âm hoặc kết thúc bằng
mysql> SELECT '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$';
+-------------------------------------------+
| '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
4mysql> SELECT name FROM metal WHERE name REGEXP '^[aeiou]|er$';
+--------+
| name |
+--------+
| copper |
| iron |
| silver |
+--------+
Dấu ngoặc đơn có thể được sử dụng để nhóm luân phiên. Ví dụ: nếu bạn muốn so khớp các chuỗi bao gồm toàn chữ số hoặc toàn chữ cái, bạn có thể thử mẫu này, sử dụng phép thay thế
mysql> SELECT '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$';
+-------------------------------------------+
| '0m' REGEXP '^[[:digit:]]+|[[:alpha:]]+$' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
Nhưng khi kết quả truy vấn hiển thị, mẫu không hoạt động. Đó là bởi vì nhóm
mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
4 với phương án thứ nhất và nhóm mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
5 với phương án thứ hai. Vì vậy, mẫu thực sự khớp với các chuỗi bắt đầu bằng một hoặc nhiều chữ số hoặc các chuỗi kết thúc bằng một hoặc nhiều chữ cái. Tuy nhiên, nếu bạn nhóm các lựa chọn thay thế trong ngoặc đơn, thì mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
4 và mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
5 sẽ áp dụng cho cả hai và mẫu sẽ hoạt động như bạn mong đợimysql> SELECT '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$';
+---------------------------------------------+
| '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$' |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
Không giống như đối sánh mẫu SQL, chỉ thành công nếu mẫu khớp với toàn bộ giá trị so sánh, biểu thức chính quy thành công nếu mẫu khớp với bất kỳ vị trí nào trong giá trị. Hai đối sánh mẫu sau đây là tương đương theo nghĩa là mỗi đối sánh chỉ thành công đối với các chuỗi chứa ký tự
mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
6, nhưng đối sánh mẫu đầu tiên hiệu quả hơn vì mẫu đơn giản hơn'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'
Biểu thức chính quy không khớp với giá trị
mysql> SELECT '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$';
+---------------------------------------------+
| '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$' |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
0. Điều này đúng cho cả mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 và cho mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
9 mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
0Thực tế là một biểu thức chính quy khớp với một chuỗi nếu mẫu được tìm thấy ở bất kỳ đâu trong chuỗi có nghĩa là bạn phải cẩn thận để không vô tình chỉ định một mẫu khớp với chuỗi trống. Nếu bạn làm như vậy, nó sẽ khớp với mọi giá trị không phải ______75_______0. Ví dụ: mẫu
mysql> SELECT '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$';
+---------------------------------------------+
| '0m' REGEXP '^[[[:digit:]]+|[[:alpha:]]+]$' |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
5 khớp với bất kỳ số lượng mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
5 ký tự nào, thậm chí không có ký tự nào. Nếu mục tiêu của bạn là chỉ khớp các chuỗi chứa các chuỗi không trống gồm _______ 5 ký tự, hãy sử dụng _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ để thay thế. mysql> SELECT name FROM metal WHERE name REGEXP '^..pp';
+--------+
| name |
+--------+
| copper |
+--------+
8 yêu cầu một hoặc nhiều phiên bản của phần tử mẫu trước đó để khớpGiống như đối sánh mẫu SQL được thực hiện bằng cách sử dụng
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'0, đối sánh biểu thức chính quy được thực hiện với
mysql> SELECT name FROM metal WHERE name REGEXP 'er$';
+--------+
| name |
+--------+
| copper |
| silver |
+--------+
2 đôi khi tương đương với so sánh chuỗi con. Các ký tự phụ mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
4 và mysql> SELECT name FROM metal WHERE name REGEXP 'er';
+---------+
| name |
+---------+
| copper |
| mercury |
| silver |
+---------+
5 phục vụ cùng một mục đích như 'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'4 hoặc
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'5, ít nhất là nếu bạn đang tìm kiếm các chuỗi ký tự
khớp mẫu
so sánh chuỗi con
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'6
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'7
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'8
'abc' REGEXP 'b' 'abc' REGEXP '^.*b.*$'9
Đối với các chuỗi không theo nghĩa đen, thông thường không thể xây dựng phép so sánh chuỗi con tương đương. Ví dụ: để khớp các chuỗi bắt đầu bằng bất kỳ chuỗi chữ số không trống nào, bạn có thể sử dụng khớp mẫu này