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脚本语言都使用正则表达式。因此, 希望读者能够查阅有关正则表达式的资料,可以进一步了解关于正则表达式的知识。