摘要:在本教程中,您将学习如何使用 MySQL REGEXP 运算符基于正则表达式执行复杂的搜索。
正则表达式简介
正则表达式是描述搜索模式的特殊字符串。它是一个功能强大的工具,为您提供了一种简洁而灵活的方法来根据模式识别文本字符串,例如字符和单词。
例如,您可以使用正则表达式来搜索电子邮件、IP 地址、电话号码、社会安全号码或任何具有特定模式的内容。
正则表达式使用自己的语法,可以由正则表达式处理器解释。正则表达式广泛应用于从编程语言到包括 MySQL 在内的数据库的几乎所有平台。
使用正则表达式的优点是,您不限于根据LIKE
运算符中的百分号 (%) 和下划线 (_) 的固定模式搜索字符串。正则表达式有更多的元字符来构造灵活的模式。
使用正则表达式的缺点是理解和维护如此复杂的模式相当困难。因此,您应该在SQL语句的注释中描述正则表达式的含义。此外,在某些情况下,如果在正则表达式中使用复杂模式,数据检索的速度会降低。
正则表达式的缩写是regex或regexp。
MySQL REGEXP 运算符
MySQL 采用了Henry Spencer实现的正则表达式。 MySQL 允许您使用REGEXP
运算符直接匹配 SQL 语句中的模式。
下面说明了WHERE
子句中REGEXP
运算符的语法:
SELECT
column_list
FROM
table_name
WHERE
string_column REGEXP pattern;
Code language: SQL (Structured Query Language) (sql)
此语句执行string_column
与pattern
的模式匹配。
如果string_column
中的值与pattern
匹配,则WHERE
子句中的表达式返回 true,否则返回 false。
如果string_column
或pattern
为NULL
,则结果为NULL
。
除了REGEXP
运算符之外,您还可以使用RLIKE
运算符,它是REGEXP
运算符的同义词。
REGEXP
运算符的否定形式是NOT REGEXP
。
MySQL REGEXP 示例
假设您要查找姓氏以字符 A、B 或 C 开头的所有产品。您可以在以下SELECT
语句中使用正则表达式:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^(A|B|C)'
ORDER BY productname;
Code language: SQL (Structured Query Language) (sql)
该模式允许您查找名称以 A、B 或 C 开头的产品。
- 字符^表示从字符串的开头开始匹配。
- 人物|意思是如果无法匹配则寻找替代方案。
下表说明了正则表达式中的一些常用元字符和结构。
元字符 | 行为 |
---|---|
^ | 匹配搜索字符串开头的位置 |
$ | 匹配搜索字符串末尾的位置 |
。 | 匹配任何单个字符 |
[…] | 匹配方括号内指定的任何字符 |
[^…] | 匹配方括号内未指定的任何字符 |
p1|p2 | 匹配任何模式 p1 或 p2 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
{n} | 匹配前一个字符的 n 个实例 |
{m,n} | 匹配前一个字符的 m 到 n 个实例 |
要查找名称以字符a
开头的产品,请在名称开头使用元字符'^'
进行匹配:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^a';
Code language: SQL (Structured Query Language) (sql)
如果您希望REGEXP
运算符以区分大小写的方式比较字符串,则可以使用BINARY运算符将字符串转换为二进制字符串。
因为MySQL是逐字节比较二进制字符串而不是逐字符比较。这允许字符串比较区分大小写。
例如,以下语句仅匹配产品名称开头的大写"C"
。
SELECT
productname
FROM
products
WHERE
productname REGEXP BINARY '^C';
Code language: SQL (Structured Query Language) (sql)
要查找名称以 f 结尾的产品,可以使用'f$'
来匹配字符串的结尾。
SELECT
productname
FROM
products
WHERE
productname REGEXP 'f$'
Code language: SQL (Structured Query Language) (sql)
要查找名称中包含单词"ford"
的产品,请使用以下查询:
SELECT
productname
FROM
products
WHERE
productname REGEXP 'ford';
Code language: SQL (Structured Query Language) (sql)
要查找名称恰好包含 10 个字符的产品,请使用“ ^'
和“ $
来匹配产品名称的开头和结尾,并重复任意字符“.” {10}
次.'
介于两者之间,如以下查询所示:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^.{10}$';
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何使用 MySQL REGEXP 运算符和正则表达式来查询数据。