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”两行满足要求。