MySQL提供了标准的SQL模式匹配,以及一种基于扩展正则表达式的模式匹配形式,类似于Unix实用程序所使用的模式匹配6,grep,sed.
SQL模式匹配使您能够使用_
匹配任何单个字符和%
匹配任意数量的字符(包括零字符)。在MySQL中,SQL模式默认情况下是不区分大小写的。这里展示了一些例子。不要使用=
或<>
当您使用SQL模式时。使用就像
或不喜欢
比较运算符。
找到以…开头的名字b
:
SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+ | 名字出生性物种| | | | |所有者死亡 | +--------+--------+---------+------+------------+------------+ | 巴菲狗哈罗德| | | f零| | 1989-05-13 | |包泽戴安| |狗| 1989-08-31 | 1989-08-31 |米 | +--------+--------+---------+------+------------+------------+
找到以…结尾的名字财政年度
:
SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+ | 名字出生性物种| | | | |所有者死亡 | +--------+--------+---------+------+------------+-------+ | 毛茸茸的猫哈罗德| | | f零| | 1993-02-04 | |巴菲狗哈罗德| | | | 1989-05-13 |空 | +--------+--------+---------+------+------------+-------+
查找包含a的名称w
:
SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+ | 名字出生性物种| | | | |所有者死亡 | +----------+-------+---------+------+------------+------------+ | 猫爪子|格温| |米零| | 1994-03-17 | |包泽戴安| | |米狗| 1989-08-31 | 1989-08-31 | |惠斯勒|格温|鸟零| 1997-12-09 | | NULL | +----------+-------+---------+------+------------+------------+
类的五个实例可以找到包含恰好五个字符的名称_
模式特点:
SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+ | 名字出生性物种| | | | |所有者死亡 | +-------+--------+---------+------+------------+-------+ | 猫的爪子|格温| |米零| | 1994-03-17 | |巴菲狗哈罗德| | | | 1989-05-13 |空 | +-------+--------+---------+------+------------+-------+
MySQL提供的另一种模式匹配使用扩展正则表达式。在测试此类型模式的匹配时,请使用REGEXP_LIKE ()
函数(或正则表达式
或RLIKE
运算符,它们是同义词REGEXP_LIKE ()
).
下面的列表描述了扩展正则表达式的一些特征:
.
匹配任何单个字符。一个字符类
[…]
匹配括号内的任何字符。例如,(美国广播公司)
匹配一个
,b
,或c
.要命名一个字符范围,请使用破折号。的[a -ž]
匹配任何字母,而[0 - 9]
匹配任何数字。*
匹配前一个对象的零个或多个实例。例如,x *
匹配任意数量的x
字符,[0 - 9] *
匹配任意数量的数字,并且.*
匹配任意数字。如果模式与被测试值中的任何位置匹配,则正则表达式模式匹配成功。(这与a不同
就像
模式匹配,只有当模式匹配整个值时才会成功。)要锚定模式,使其必须与被测试值的开始或结束相匹配,请使用
^
在开始的时候$
在模式的最后。
要演示扩展正则表达式是如何工作的,可以使用就像
前面显示的查询在这里重写以使用REGEXP_LIKE ()
.
找到以…开头的名字b
,使用^
要匹配名称的开头:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+ | 名字出生性物种| | | | |所有者死亡 | +--------+--------+---------+------+------------+------------+ | 巴菲狗哈罗德| | | f零| | 1989-05-13 | |包泽戴安| |狗| 1979-08-31 | 1979-08-31 |米 | +--------+--------+---------+------+------------+------------+
要强制正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用二进制
关键字将其中一个字符串设为二进制字符串,或指定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');
找到以…结尾的名字财政年度
,使用$
要匹配名字的结尾:
SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+ | 名字出生性物种| | | | |所有者死亡 | +--------+--------+---------+------+------------+-------+ | 毛茸茸的猫哈罗德| | | f零| | 1993-02-04 | |巴菲狗哈罗德| | | | 1989-05-13 |空 | +--------+--------+---------+------+------------+-------+
查找包含a的名称w
,使用这个查询:
SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');+----------+-------+---------+------+------------+------------+ | 名字出生性物种| | | | |所有者死亡 | +----------+-------+---------+------+------------+------------+ | 猫爪子|格温| |米零| | 1994-03-17 | |包泽戴安| | |米狗| 1989-08-31 | 1989-08-31 | |惠斯勒|格温|鸟零| 1997-12-09 | | NULL | +----------+-------+---------+------+------------+------------+
因为正则表达式模式匹配的前提是它出现在值的任何位置,所以在前面的查询中,不必在模式的任意一侧放置通配符来匹配整个值,就像SQL模式一样。
要查找包含恰好五个字符的名称,请使用^
而且$
匹配名称的开头和结尾,以及的五个实例.
之间:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+ | 名字出生性物种| | | | |所有者死亡 | +-------+--------+---------+------+------------+-------+ | 猫的爪子|格温| |米零| | 1994-03-17 | |巴菲狗哈罗德| | | | 1989-05-13 |空 | +-------+--------+---------+------+------------+-------+
方法编写前面的查询{
(”重复,n
}n
两度”)操作符:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+ | 名字出生性物种| | | | |所有者死亡 | +-------+--------+---------+------+------------+-------+ | 猫的爪子|格温| |米零| | 1994-03-17 | |巴菲狗哈罗德| | | | 1989-05-13 |空 | +-------+--------+---------+------+------------+-------+
有关正则表达式语法的更多信息,请参见第12.8.2节,“正则表达式”.