模式匹配

MySQL提供标准的SQL模式匹配以及基于扩展的正则表达式的模式匹配形式,类似于Unix实用程序(如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提供的另一种模式匹配使用扩展的正则表达式,当你测试此类模式的匹配项时,请使用REGEXP_LIKE()函数(或REGEXPRLIKE运算符,它们是REGEXP_LIKE()的同义词)。

以下列表描述了扩展的正则表达式的一些特征:

  • .匹配任何单个字符。
  • 字符类[...]匹配括号内的任何字符,例如,[abc]匹配abc,要命名一系列字符,请使用短划线,[a-z]匹配任何字母,而[0-9]匹配任何数字。
  • *匹配前一项的零个或多个实例,例如,x*匹配任意数量的x字符,[0-9]*匹配任意数量的数字,而.*匹配任意数量的任何东西。
  • 如果模式匹配正在测试的值中的任何位置,则正则表达式模式匹配成功,这与LIKE模式匹配不同,LIKE模式匹配仅在模式匹配整个值时才会成功。
  • 要锚定模式以使其必须与要测试的值的开头或结尾匹配,请在模式的开始处使用^或在模式的结束处使用$

为了演示扩展的正则表达式的工作原理,先前显示的LIKE查询将在此处重写以使用REGEXP_LIKE()

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

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

要强制将正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用BINARY关键字使其中一个字符串成为二进制字符串,或指定c匹配控制字符,这些查询中的每一个仅匹配名称开头的小写字母b

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');

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

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '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 REGEXP_LIKE(name, '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       |
+----------+-------+---------+------+------------+------------+

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

要查找包含五个字符的名称,请使用^$来匹配名称的开头和结尾,以及中间五个.实例:

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

你还可以使用{n}(“重复n次”)运算符编写上一个查询:

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

上一篇:使用NULL值

博弈
2.5k 声望1.5k 粉丝

态度决定一切