「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
对于基本的过滤,用匹配、比较和通配操作符寻找数据足够了。但随着过滤条件的复杂性的增加,WHERE子句本身的复杂性也有必要增加。
这也就是正则表达式变得有用的地方。
我们从一个非常简单的例子开始。下面的语句检索列p_name包含文本1000的所有行:
select p_name from products
where p_name REGEXP '1000' ORDER BY p_name;
输出:
除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句。它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。
为什么还要用正则表达式?在刚才的例子中,正则表达式确实没有带来太多好处(可能还会降低性能),不过,请考虑下面的例子:
select p_name from products
where p_name REGEXP '.000' ORDER BY p_name;
输出:
这里使用了正则表达式.000。.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回。当然,这个特殊的例子也可以用LIKE和通配符来完成。
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。
为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:
select p_name from products
where p_name REGEXP '1000|2000' ORDER BY p_name;
输出
语句中使用了正则表达式1000|2000。|为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。使用|从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并入单个正则表达式。
匹配任何单一字符。但是,如果你只想匹配特定的字符,怎么办?可通过指定一组用[和]括起来的字符来完成,如下所示:
select p_name from products
where p_name REGEXP '[123] ton' ORDER BY p_name;
输出如下:
这里,使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回(没有3 ton)。