当前位置:嗨网首页>书籍在线阅读

16-使用正则表达式表示查询

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.10 使用正则表达式表示查询

本节视频教学录像:10分钟

正则表达式是用某种模式去匹配一类字符串的一种方式,其查询能力要远在通配字符之上,而且相对更加灵活。在MySQL中使用REGEXP关键字来匹配查询正则表达式,基本形式如下。

属性名 REGEXP‘匹配方式’

1.模式字符“^”

模式字符“^”的含义为匹配以特定字符或者字符串开头的记录。

【范例8-47】

查询学生所在的系以“计”开头的学生记录。

MySQL> select * -> from student -> where sdept regexp '^计';

结果如下。

+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 2|周松 |男 | 21|计算机| +-----+-------+------+------+--------+ 2 rows in set (0.00 sec)

student表中有两条记录中的sdept字段以“计” 开头,返回这两条记录。

2.模式字符“$”

模式的字符“$”的含义为匹配以特定字符或者字符串结尾的记录。

【范例8-48】

查询姓名中以“敏“字为最后一个字符的学生信息。

MySQL>select * -> from student -> where sname regexp ‘敏$’;

结果入下。

+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| +-----+-------+------+------+--------+ row in set (0.00 sec)

student表中只有一条记录sname最后的字符为“敏”,结果返回这一条记录。

3.模式字符“.”

模式字符“.”的含义为匹配字符串中任意一个字符,包括Enter或者换行等。

有一表test(aa varchar(20)),后面正则表达式的查询例子均基于该表,该表中的记录如下。

MySQL> select * from test; +----------+ |aa | +----------+ |a | |abcd | | kkabcdkk | | kksdfasd | |ghjkmn | |aupbkkk | |akkkkkk | +----------+ rows in set (0.00 sec)

【范例8-49】

查询test表中aa 以‘a’开头,中间有两个字符,最后一个字符为d的记录。

MySQL> select * -> from test -> where aa regexp('^a..d$');

结果如下。

+------+ |aa | +------+ | abcd | +------+ 1 row in set (0.00 sec)

查询中匹配模式为“^a..d$”,要求以“a”为开始字符,最后为字符“d”,“a”和“d”两个字符之间包含两个字符,查询得到一条记录满足要求。

4.模式字符“[字符集合]”

模式字符“[字符集合]”的含义为匹配字符集合中任意一个字符。

【范例8-50】

查询上例中表test中aa列中含字母b和字母s的记录。

MySQL> select * -> from test -> where aa regexp '[bs]';

结果如下。

+----------+ |aa | +----------+ |abcd | | kkabcdkk | | kksdfasd | |aupbkkk | +----------+ 4 rows in set (0.00 sec)

test表中包含字符“b”或字符“s”的有4条记录,查询得到该4条记录。

模式字符“[字符集合]”还可以指定集合区间,例如[4-10]指定集合区间的所有数字,[a-m]指定集合区间的所有字母。

5.模式字符“[^字符集合]”

模式字符“[^字符集合]”的含义是匹配不在指定字符集合中的任何字符。

【范例8-51】

查询上例中表test中aa列中包含字母a~m之外的字符的记录。

MySQL> select * -> from test -> where aa regexp '[^a-m]';

结果如下。

+----------+ |aa | +----------+ | kksdfasd | |ghjkmn | |aupbkkk | +----------+ 3 rows in set (0.00 sec)

该查询希望包含没有在字母a~m之间的字符的记录,只有3行记录满足要求。

6.模式字符“S1|S2|S3”

模式字符“S1|S2|S3”的含义为匹配 S1、S2、S3中的任意一个字符串。

【范例8-52】

查询上例中表test中aa列中含字“ab”“sd”和“mn”的记录。

MySQL> select * -> from test -> where aa regexp 'ab|sd|mn';

结果如下。

+----------+ |aa | +----------+ |abcd | | kkabcdkk | | kksdfasd | |ghjkmn | +----------+ rows in set (0.06 sec)

test表中的列值“abcd”和“kkabcdkk”包含“ab”“,kksdfasd”包含“sd”“,ghjkmn”包含“mn”,4条记录满足要求。

7.模式字符“*”

模式字符“*”的含义为匹配多个该字符之前的字符,包括0和1个。

【范例8-53】

查询上例中表test中aa列中a后面跟b或不跟b。

MySQL> select -> from test -> where aa regexp ‘ab’;

结果如下。

+----------+ |aa | +----------+ |a | |abcd | | kkabcdkk | | kksdfasd | |aupbkkk | |akkkkkk | +----------+ rows in set (0.00 sec)

模式‘ab’中的“”前为“b,”意味着b可以出现0次1次或更多次。表中的6行记录满足要求。

8.模式字符“+”

模式字符“+”的含义为匹配多个该字符之前的字符,包括 1个。

【范例8-54】

查询上例中表test中aa列中a后面至少跟一个b。

MySQL> select * from test -> where aa regexp 'ab+';

结果如下。

+----------+ |aa | +----------+ |abcd | | kkabcdkk | +----------+ 2 rows in set (0.00 sec)

模式‘ab+’中的“b”后面是“+”,意味着“a”后的“b”至少出现一次,test表中的记录只有2行满足要求。

9.模式字符“字符串{N}”

匹配方式中的N表示前面的字符串至少要出现N次。

【范例8-55】

查询上例中表test中aa列中“k”至少连续出现4次。

MySQL> select * -> from test -> where aa regexp 'k{4}';

结果如下。

+---------+ |aa | +---------+ | akkkkkk | +---------+ row in set (0.00 sec)

模式‘k{4}’中要求k字符至少连续出现4次,test表中“akkkkkk”行满足要求。

10.模式字符“字符串{M,N}”

匹配方式中的M和N表示前面的字符串出现至少M次,最多N次。

【范例8-56】

查询上例中表test中aa列中“ab”至少连续出现1次,最多2次。

MySQL> select * -> from test -> where aa regexp 'ab{1,2}';

结果如下。

+----------+ |aa | +----------+ |abcd | | kkabcdkk | +----------+ rows in set (0.00 sec)

模式‘ab{1,2}’查询“ab”至少出现1次,最多2次。test表中“abcd”“kkabcdkk”两行满足要求。