Mysql教程

10.8使用正则表达式查询

正则表达式是用某种模式去匹配一类字符串的一个方式。例如,使用正则表达式可以查询出包含A、B和C其中任一字母的字符串。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。正则表达式可以应用于非常复杂查询。本节将详细讲解如何使用正则表达式来查询。

MySQL中,使用REGEXP关键字来匹配査询正则表达式。其基本形式如下:

属性名REGEXP '匹配方式'

其中,“属性名”参数表示需要查询的字段的名称;“匹配方式”参数表示以哪种方式来进行匹配查询。“匹配方式”参数中有很多的模式匹配的字符,它们分别表示不同的 意思,如下表所示。

正则表达式的模式字符 含义
^ 匹配字符串开始的部分
$ 匹配字符创结束的部分
. 代表字符串中任意的一个字符,包括回车和换行
[字符集合] 匹配"字符集合"中的任何一个字符
[^字符集合] 匹配除了"字符集合"以外的任何一个字符
S1|S2|S3 匹配中的S1,S2,S3任意一个字符
* 代表多个该符号之前的字符,包括0和1
+ 代表多个该符号之前的字符,包括0和1
字符串{N} 字符串出现N次
字符串{M,N} 字符串出现至少M次,最多N次

这里的正则表达式与Java语言、PHP语言等编程语言中的正则表达式基本一致。

10.8.1查询以特定字符或字符串开头的记录

使用字符“^”可以匹配以特定字符或字符串开头的记录。

【示例10-72】下面从info字段中查询以字母'L'开头的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP '^L';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP '^L';
+----+----+
| id |name|
+----+----+
|  5 |Lucy|
|  6 |Lily|
+----+----+
2 rows in set(0.00 sec)

结果显示,查询出了name字段中以字母L开头的两条记录。

【示例10-73】下面从info表name字段中查询以字符串'aaa'开头的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP '^aaa';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP '^aaa';
+----+-----+
| id |name |
+----+-----+
|  8 |aaa  |
| 10 |aaabd|
+----+-----+
2 rows in set(0.00 sec)

结果显示,查询出了name字段中以字母aaa开头的两条记录。

10.8.2 查询已特定字符或字符串结尾的记录

使用字符“$”,可以匹配以特定字符或字符串结尾的记录。

【示例10-74】下面从info表name字段中查询以字母c结尾的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP 'c$';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP 'c$';
+----+-----+
| id |name |
+----+-----+
|  1 |Aric |
|  2 |Eric |
+----+-----+
2 rows in set(0.00 sec)

结果显示,查询出了name字段中以字母c结尾的两条记录。

10.8.3用符号"."来替代字符串中的任意一个字符

用正则表达式来查询时,可以用"."来替代字符串中的任意一个字符。

【示例10-75】下面从info表name字段中査询以字母‘L’开头,以字母‘Y’结尾,中间有两个任意字符的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP '^L..y$';

其中,L表示以字母L开头;两个“.”表示两个任意字符;Y$表示以字母7结尾。代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP '^L..y$';
+----+----+
| id |name|
+----+----+
|  5 |Lucy|
|  6 |Lily|
+----+----+
2 rows in set(0.00 sec)

査询结果为Lucy和Lily。这刚好是以字母L开头,以字母Y结尾,中间有两个任意字符的记录。

10.8.4 匹配指定字符中的任意一个

【示例10-76】下面从info表name字段中查询包含c、e和c 3个字母中任意一个的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP '[ceo]';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP '[ceo]';
+----+-----+
| id |name |
+----+-----+
|  1 |Aric |
|  2 |Eric |
|  4 |Jack |
|  5 |Lucy |
|  7 |Tom  |
| 11 |abc12|
+----+-----+
2 rows in set(0.00 sec)

查询结果都包含这3个字母中任意一个。


10.8.5 匹配指定字符以外的字符

使用"[^字符集合]"可以匹配指定字符以外的字符。

【示例10-77】下面从info表name字段中査询包含'a'到'w'字母和数字以外的字符的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP '[^a-wO-9]';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP '[^a-w0-9]';
+----+----+
| id |name|
+----+----+
|  5 |Lucy|
|  6 |Lily|
+----+----+
2 rows in set(0.00 sec)

查询结果为Lucy和Lily。因为这两个字符串包含字母y,这个字母是在指定范围之外的。

10.8.6匹配指定字符串

正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录查询出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。

【示例10-78】下面从info表name字段中查询包含‘ic’的记录。SQL代码如下:

 SELECT * FROM info WHERE name REGEXP 'ic';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP 'ic';
+-----+----------+
|  id |   name   |
+-----+----------+
|   1 |   Aric   |
|   2 |   Eric   |
+-----+----------+
2 rows in set(0.00 sec)

查询结果为Airc和Eric。这两条记录中都包含ic。

注意:指定多个字符串时,需要用符号"|"将这些字符串隔开。每个字符串与"|"之 间不能有空格。因为,查询过程中,数据库系统会将空格也当作一个字符。这样就查询不出想要的结果。查询可以指定的字符串不止3个。

10.8.7 使用"*"和"+"来匹配多个字符

正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而“*”可以表示0个字符。

【示例10-79】下面从info表name字段中查询字母‘c’之前出现过‘a’的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP 'a*c';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP 'a*c';
+-----+----------+
|  id |   name   |
+-----+----------+
|   1 |   Aric   |
|   2 |   Eric   |
|   4 |   Jack   |
|   5 |   Lucy   |
|  11 |  abc12   |
+-----+----------+
5 rows in set(0.00 sec)

查询结果显示,Aric、Eric和Lucy中的字母c之前并没有a。因为“*”可以表示0个,所以“a*c”表示字母c之前有0个或者多个a出现。上述的情况都是属于前面出现过 0个的情况。如果使用‘+’,其SQL代码如下:

SELECT * FROM info WHERE name REGEXP 'a+c';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP 'a+c';
+-----+----------+
|  id |   name   |
+-----+----------+
|   4 |   Jack   |
+-----+----------+
1 rows in set(0.00 sec)

查询结果只有一条。只有Jack是刚好字母c前面出现了a。因为a+c表示字母c前面至少有一个字母a。

10.8.8使用{M}{M,N}来指定字符串连续出现的次数

正则表达式中,“字符串{M}”表示字符串连续出现M次;“字符串{M,N}”表示字符串联连续出现至少M次,最多N次。例如,“ab{2}”表示字符串“ab”连续出现两次。 “ab{2,4}”表示字符串“ab”连续出现至少两次,最多4次。

【示例10-80】下面从info表name字段中查询出现过'a'3次的记录。SQL代码如下:

SELECT * FROM info WHERE name REGEXP 'a{3}';

代码执行结果如下:

mysql>SELECT * FROM info WHERE name REGEXP 'a{3}';
+-----+----------+
|  id |   name   |
|   8 |   aaa    |
|   9 |   dadaaa |
|   10|   aaabd  |
+-----+----------+
3 rows in set(0.00 sec)

查询结果中都包含了aaa。

说明:正则表达式的功能非常强大,使用正则表达式可以灵活的设置字符串匹配的条件。而且,Java语言、C#语言、PHP语言和shell脚本语言都使用正则表达式。因此, 希望读者能够查阅有关正则表达式的资料,可以进一步了解关于正则表达式的知识。

关注微信获取最新动态