3.3.4.7模式匹配

 

MySQL提供标准的SQL模式匹配以及基于扩展的正则表达式的模式匹配形式,类似于Unix实用程序所使用的扩展形式,例如 vigrep和 sed

SQL模式匹配使您可以_ 用来匹配任何单个字符并%匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认情况下不区分大小写。这里显示了一些示例。请勿使用 =<>使用SQL模式时。改用LIKE或 NOT 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提供的另一种模式匹配使用扩展的正则表达式。在测试此类型的模式是否匹配时,请使用 REGEXP_LIKE()函数(或 REGEXP或 RLIKE 运算符,它们是的同义词 REGEXP_LIKE())。

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

  • . 匹配任何单个字符。

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

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

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

  • 锚定的图案,使得它必须使用匹配的值的开头或结尾正在测试中,^在开始时或$在图案的端部。

为了演示扩展的正则表达式是如何工作的,LIKE先前显示的 查询在此处被重写为use 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 match-control字符。这些查询中的每个查询都只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  |
+-------+--------+---------+------+------------+-------+

您还可以使用 (“ repeat- -times ”)运算符编写上一个查询 : {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  |
+-------+--------+---------+------+------------+-------+

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

原文地址:https://www.cnblogs.com/owlin/p/13730856.html