我们已经了解到MySQL可以通过LIKE ...%来进行模糊匹配。
MySQL同样也支持其他正则表达式的匹配,MySQL中使用REGEXP操作符来进行正则表达式匹配。
下表中的正则模式可应用于REGEXP操作符中
| 模式 | 描述 |
|---|---|
^ |
匹配输入字符串的开始位置。 如果设置了 RegExp 对象的 Multiline 属性, ^也匹配\n或\r之后的位置 |
$ |
匹配输入字符串的结束位置。 如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 \n或\r之前的位置 |
. |
匹配除\n之外的任何单个字符。要匹配包括 \n在内的任何字符,请使用像[.\n]的模式 |
[...] |
字符集合。匹配所包含的任意一个字符。 例如, [abc]可以匹配plain中的a |
[^...] |
负值字符集合。匹配未包含的任意字符。 例如, [^abc]可以匹配plain中的p |
p1\|p2\|p3 |
匹配 p1 或 p2 或 p3。 例如, z\|food 能匹配z或food;(z\|f)ood则匹配zood或food |
* |
匹配前面的子表达式零次或多次。 例如, zo*能匹配z以及zoo。*等价于{0,} |
+ |
匹配前面的子表达式一次或多次。 例如, zo+能匹配zo以及zoo,但不能匹配z。+ 等价于{1,} |
{n} |
n是一个非负整数。匹配确定的n次。例如: o{2}不能匹配Bob中的o,但是能匹配food中的两个 o |
{n,m} |
m和n均为非负整数,其中n <= m。最少匹配 n次且最多匹配m次 |
使用实例
了解以上的正则需求后,我们就可以根据自己的需求来编写带有正则表达式的SQL语句。以下列出几个小实例(表名:person_tbl)来加深我们的理解:
查找name字段中以’st’为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以’ok’为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含’mar’字符串的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';