MySQL使用正则表达式查询

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客

《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)

MySQL9数据库技术_夏天又到了的博客-CSDN博客

正则表达式通常用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如,从一个文本文件中提取电话号码,查找一篇文章中重复的单词或者替换用户输入的某些敏感词语等,这些地方都可以使用正则表达式。正则表达式强大而且灵活,可以应用于非常复杂的查询。

MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式。表5.3列出了REGEXP操作符中常用的字符匹配。

5.8.1 查询以特定字符或字符串开头的记录

字符"^"匹配以特定字符或者字符串开头的文本。

【例5.68】在表fruits中,查询f_name字段中以字母"b"开头的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^b';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | banana     |   10.30 |
+------+------+------------+---------+

表fruits中有3条记录的f_name字段值是以字母b开头的,因此返回结果中有3条记录。

【例5.69】在表fruits中,查询f_name字段中以"be"开头的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^be';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b2   |  104 | berry  |    7.60 |
+------+------+--------+---------+

只有berry是以"be"开头的,因此查询结果中只有1条记录。

5.8.2 查询以特定字符或字符串结尾的记录

字符"$"匹配以特定字符或者字符串结尾的文本。

【例5.70】在表fruits中,查询f_name字段中以字母"y"结尾的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'y$';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| c0   |  101 | cherry     |    3.20 |
| m2   |  105 | xbabay     |    2.60 |
+------+------+------------+---------+

表fruits中有4条记录的f_name字段值是以字母"y"结尾的,因此返回结果中有4条记录。

【例5.71】在表fruits中,查询f_name字段中以字符串"rry"结尾的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'rry$';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| c0   |  101 | cherry     |    3.20 |
+------+------+------------+---------+

表fruits中有3条记录的f_name字段值是以字符串"rry"结尾的,因此返回结果中有3条 记录。

5.8.3 用符号"."来替代字符串中的任意一个字符

字符"."匹配任意一个字符。

【例5.72】在表fruits中,查询f_name字段中包含字母"a"与"g"且两个字母之间只有一个字母的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'a.g';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| bs1  |  102 | orange |   11.20 |
| m1   |  106 | mango  |   15.70 |
+------+------+--------+---------+

在查询语句中,"a.g"指定匹配字符中要有字母a和g,且两个字母之间包含单个字符,并不限定匹配的字符的位置和所在查询字符串的总长度,因此orange和mango都符合匹配条件。

5.8.4 使用"*"和"+"来匹配多个字符

星号"*"匹配前面的字符任意多次,包括0次。加号(+)匹配前面的字符至少一次。

【例5.73】在表fruits中,查询f_name字段中以字母"b"开头且"b"后面出现紧跟字母"a"的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba*';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | banana     |   10.30 |
+------+------+------------+---------+

星号(*)可以匹配任意多个字符,因此blackberry和berry中字母"b"后面虽然没有出现字母"a",但是也满足匹配条件。

【例5.74】在表fruits中,查询f_name字段中以字母"b"开头且"b"后面字母"a"至少出现一次的记录,SQL语句如下:

复制代码
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba+';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| t1   |  102 | banana |  10.30  |
+------+------+--------+---------+

"a+"匹配字母"a"至少一次,只有banana满足匹配条件。

相关推荐
要开心吖ZSH6 分钟前
处方物流信息同步优化:从 36 秒到亚秒级的踩坑记录
java·数据库·mysql·性能优化
yoothey1 小时前
MySQL 数据库连接池调优实战
数据库·mysql
Tian_Hang1 小时前
Eclipse Mosquitto 安装及介绍
java·运维·服务器·ide·sql·mysql·eclipse
南墙上的石头13 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
执子手 吹散苍茫茫烟波15 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
峥无19 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
要开心吖ZSH1 天前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
万亿少女的梦1681 天前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦1681 天前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
翔云1234561 天前
简单概括主库上 Executed_Gtid_Set 是什么时候更新的
数据库·mysql