前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql常用sql语句(21)- regexp 正则表达式查询

Mysql常用sql语句(21)- regexp 正则表达式查询

作者头像
小菠萝测试笔记
发布2020-06-09 16:16:52
1.9K0
发布2020-06-09 16:16:52
举报
文章被收录于专栏:自动化、性能测试

测试必备的Mysql常用sql语句系列

https://www.cnblogs.com/poloyy/category/1683347.html

前言

正则的强大不言而喻,Mysql中也提供了 regexp 关键字来进行正则查询

正则查询的语法格式

代码语言:javascript
复制
<列名> regexp '正则表达式'

常用的正则表达式

选项

说明

例子

匹配值示例

^

匹配文本的开始字符

'^b' 匹配以字母 b 开头的字符串

book、big、banana、bike

$

匹配文本的结束字符

'st$' 匹配以 st 结尾的字符串

test、resist、persist

.

匹配任何单个字符

'b.t' 匹配任何 b 和 t 之间有一个字符

bit、bat、but、bite

*

匹配零个或多个在它前面的字符

'f*n' 匹配字符 n 前面有任意个字符 f

fn、fan、faan、abcn

+

匹配前面的字符 1 次或多次

'ba+' 匹配以 b 开头,后面至少紧跟一个 a

ba、bay、bare、battle

<字符串>

匹配包含指定字符的文本

'fa' 匹配包含‘fa’的文本

fan、afa、faad

[字符集合]

匹配字符集合中的任何一个字符

'[xz]' 匹配 x 或者 z

dizzy、zebra、x-ray、extra

[^]

匹配不在括号中的任何字符

'[^abc]' 匹配任何不包含 a、b 或 c 的字符串

desk、fox、f8ke

字符串{n,}

匹配前面的字符串至少 n 次

'b{2}' 匹配 2 个或更多的 b

bbb、bbbb、bbbbbbb

字符串{n,m}

匹配前面的字符串至少 n 次, 至多 m 次

'b{2,4}' 匹配最少 2 个,最多 4 个 b

bbb、bbbb

先看看product表有什么数据

product表

这里没有截全哈,因为数据比较多

栗子一:^

代码语言:javascript
复制
select * from product where product_name regexp '^2018';

栗子二:$

代码语言:javascript
复制
select * from product where product_name regexp '潮$';

先看看emp表有什么数据

emp表

后面再解释下为啥又换表了

栗子三: *、+

po*:查询 name 字段包含字母 p ,且 p 后面出现字母 o 的记录,而 * 可以表示0个字符,代表不出现

代码语言:javascript
复制
select * from emp where name regexp 'po*';

po+:查询 name 字段包含字母 p ,且 p 后面出现字母 o 的记录,但 + 表示至少出现1个字符

代码语言:javascript
复制
select * from emp where name regexp 'po+';

栗子四:[]

下面两种写法是一样的,用 , 隔开每个字符,可能可读性更高

代码语言:javascript
复制
select * from emp where name regexp '[p,s]';
select * from emp where name regexp '[ps]';

栗子五:[^]

注意:这里的^是取反,不是开头的意思哦!不要混淆

查询 id >=10 且 开头字母 p 的记录

代码语言:javascript
复制
select * from emp where id >=10 and  name regexp '^[^p]';

为啥中途换表

因为,我发现正则表达式并不是对所有中文都生效,举个下面的栗子

代码语言:javascript
复制
select * from emp where name regexp '[小]';

可以看到,name 字段需要匹配到一个【小】才应该被返回,但是除了红框以外的数据都被返回了,有问题有问题....

那为什么会这样呢?
  • 原来,是因为 regexp 不支持多字节匹配,说白了,就是不支持中文编码
  • 要想查询中文,最好通过 like 关键字进行模糊匹配啦
当然啦,也不是没有解决办法

只需要用小括号()把中文括起来就行了

代码语言:javascript
复制
select * from emp where name regexp '^(小)';

但,这种写法在 [ ] 里面还是不起作用

代码语言:javascript
复制
select * from emp where name regexp '[(小)]';

所以啊,还是推荐用 like 模糊匹配中文字符吧!而且日常工作中也完全够用啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正则查询的语法格式
  • 常用的正则表达式
    • product表
    • 栗子一:^
    • 栗子二:$
      • emp表
      • 栗子三: *、+
      • 栗子四:[]
      • 栗子五:[^]
      • 为啥中途换表
        • 那为什么会这样呢?
          • 当然啦,也不是没有解决办法
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档