3.3.4.7 模式匹配

MySQL 提供了标准的 SQL 模式匹配以及基于扩展的正则 table 达式的模式匹配形式,该正则 table 达式类似于 UnixUtil 使用的那些正则 table 达式,例如 vigrepsed

SQL 模式匹配使您可以使用_匹配任何单个字符,使用%匹配任意数量的字符(包括零个字符)。在 MySQL 中,SQL 模式默认情况下不区分大小写。这里显示了一些示例。使用 SQL 模式时,请勿使用=<>。请改用LIKENOT LIKE比较运算符。

查找以b开头的名称:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

查找以fy结尾的名称:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

查找包含w的名称:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

要查找正好包含五个字符的名称,请使用_模式字符的五个实例:

mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

MySQL 提供的另一种模式匹配使用扩展的正则 table 达式。在测试此类型的模式是否匹配时,请使用REGEXPNOT REGEXP运算符(或RLIKENOT RLIKE,它们是同义词)。

下 table 描述了扩展正则 table 达式的一些 Feature:

  • .匹配任何单个字符。

  • 字符类别[...]与括号内的任何字符匹配。例如,[abc]匹配abc。要命名字符范围,请使用破折号。 [a-z]匹配任何字母,而[0-9]匹配任何数字。

  • *匹配零个或多个其前面事物的实例。例如,x*匹配任意数量的x字符,[0-9]*匹配任意数量的数字,.*匹配任意数量的任何东西。

  • 如果正则 table 达式模式匹配成功,则该模式匹配成功。 (这与LIKE模式匹配不同,后者仅在模式匹配整个值时才成功。)

  • 要定位模式,使其必须与要测试的值的开头或结尾匹配,请在模式的开头使用^或在模式的末尾使用$

为了演示扩展正则 table 达式的工作方式,此处显示的LIKE查询在此处重写为使用REGEXP

要查找以b开头的名称,请使用^匹配名称的开头:

mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

要强制REGEXP比较区分大小写,请使用BINARY关键字将字符串之一设置为二进制字符串。此查询仅匹配名称开头的小写b

SELECT * FROM pet WHERE name REGEXP BINARY '^b';

要查找以fy结尾的名称,请使用$匹配名称的末尾:

mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

要查找包含w的名称,请使用以下查询:

mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

因为正则 table 达式模式匹配(如果它出现在值中的任何位置),则在上一个查询中不必在模式的任何一侧放置通配符以使其与整个值匹配,这与 SQL 模式相同。

要查找正好包含五个字符的名称,请使用^$匹配名称的开头和结尾,并在两者之间使用.的五个实例:

mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

您还可以使用{n}(“ repeat- * n * -times”)运算符来编写上一个查询:

mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

有关正则 table 达式的语法的更多信息,请参见第 12.7.2 节“正则 table 达式”