MySQL语句与正则表达式
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。
1、元字符说明
| 元字符 | 说明 |
| ^ | 使表达式定位到一行的开头 |
| $ | 使表达式定位到一行的末尾 |
| 元字符 | 说明 | |
| | | 替换 | 分隔替换选项,通常与分组操作符 () 一起使用 |
| () | 分组 | 将子表达式分组为一个替换单元、量词单元或后向引用单元 |
| [char] | 字符列表 | 表示一个字符列表;一个字符列表中的大多数元字符(除字符类、^ 和 - 元字符之外)被理解为文字 |
2、进行OR匹配
为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:
SELECT prod_name
FROM products
WHERE prod_name REGEXP'1000|2000'
ORDER BY prod_name;
语句中使用了正则表达式1000|2000。 |为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。
使用|从功能上类似于在SELECT语句中使用OR语句, 多个OR条件可并入单个正则表达式。
两个以上的OR条件 可以给出两个以上的OR条件。例如,'1000 | 2000 | 3000'将匹配1000或2000或3000。
3、匹配几个字符之一
SELECT prod_name
FROM products
WHERE prod_name REGEXP [123]Ton'
ORDER BY prod_name;
这里,使用了正则表达式[123] Ton。 [123]定义一组字符,它的意思是匹配1或2或3,因此, 1 ton和2 ton都匹配且返回(没有3 ton)。
正如所见, []是另一种形式的OR语句。 事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写,也可以使用后者。
SELECT prod_name
FROM products
WHERE prod_name REGEXP'1|2|3 Ton'
ORDER BY prod_name;检索结果并不跟上面相同,而是'1'或'2'或'3 ton'。
字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^即可。因此,尽管[123]匹配字符1、 2或3,但[^123]却匹配除这些字符外的任何东西。
4、匹配范围
集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]
为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能上等同于上述数字列表:[0-9]
范围不限于完整的集合, [1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的, [a-z]匹配任意字母字符。举一个例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5]Ton'
ORDER BY prod_name;
这里使用正则表达式[1-5] Ton。 [1-5]定义了一个范围,这个表达式意思是匹配1到5,因此返回3个匹配行。由于5 ton匹配,所以返回.5 ton。
5、匹配特殊字符
为了匹配特殊字符,必须用\\为前导。\\-表示查找-, \\.表示查找.。
正则表达式语言由具有特定含义的特殊字符构成。我们已经看到.、[]、|和-等,还有其他一些字符。请问,如果你需要匹配这些字符,应该怎么办呢?例如,如果要找出包含.字符的值,怎样搜索?请看下面的例子:
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP'\\.'
ORDER BY vend_name;
这才是期望的输出。 \\.匹配.,所以只检索出一行。这种处理就是所谓的转义( escaping),正则表达式内具有特殊意义的所
有字符都必须以这种方式转义。这包括.、 |、 []以及迄今为止使用过的其他特殊字符。
空白元字符
| 元字符 | 说明 |
| \\f | 换页 |
| \\n | 换行 |
| \\r | 回车 |
| \\t | 制表 |
| \\v | 纵向制表 |
匹配\ 为了匹配反斜杠( \)字符本身,需要使用\\\。
6、匹配字符类
存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类( character class)。
字符类
| 类 | 说明 |
| [:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
| [:alpha:] | 任意字符(同[a-zA-Z]) |
| [:blank:] | 空格和制表(同[\\t]) |
| [:cntrl:] | ASCII控制字符( ASCII 0到31和127) |
| [:digit:] | 任意数字(同[0-9]) |
| [:graph:] | 与[:print:]相同,但不包括空格 |
| [:lower:] | 任意小写字母(同[a-z]) |
| [:print:] | 任意可打印字符 |
| [:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
| [:space:] | 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v]) |
| [:upper:] | 任意大写字母(同[A-Z]) |
| [:xdigit:] | 任意十六进制数字(同[a-fA-F0-9]) |
7、匹配多个实例
例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等。
重复元字符
| 元字符 | 说明 |
| * | 0个或多个匹配 |
| + | 1个或多个匹配(等于{1,}) |
| ? | 0个或1个匹配(等于{0,1}) |
| {n} | 指定数目的匹配 |
| {n,} | 不少于指定数目的匹配 |
| {n,m} | 匹配数目的范围( m不超过255) |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9]sticks?\\)'
ORDER BY prod_name;
正则表达式\\([0-9] sticks?\\)需要解说一下。 \\(匹配),[0-9]匹配任意数字(这个例子中为1和5), sticks?匹配stick和sticks( s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现), \\)匹配)。没有?,匹配stick和sticks会非常困难。
下面的例子是匹配连在一起的4位数字:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}
ORDER BY prod_name;
[:digit:]匹配任意数字,因而它为数字的一个集合。 {4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
除了上面这种表达还有一种方法供大家参考。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;
8、定位符
为了匹配特定位置的文本,需要使用定位符。
定位元字符
| 元字符 | 说明 |
| ^ | 文本的开始 |
| $ | 文本的末尾 |
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
^匹配串的开始。因此, ^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。没有^, 则还要多检索出4个别的行 (那些中间有数字的行)。
^的双重用途 ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。
使REGEXP起类似LIKE的作用 LIKE和REGEXP的不同在于, LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。
简单的正则表达式测试 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0 (没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。相应的语法如下:
SELECT 'hello' REGEXP '[0-9]';
这个例子显然将返回0(因为文本hello中没有数字)。
MySQL语句与正则表达式的更多相关文章
- php代码优化,mysql语句优化,面试需要用到的
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...
- MySQL中REGEXP正则表达式使用大全
REGEXP在mysql是用来执行正则表达式的一个函数 像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看. ...
- MySQL中的正则表达式
正则表达式是用正则表达式语言来建立 基本字符的匹配 .是正则表达式语言中的一个特殊的字符,它表示匹配任意一个字符 在LIKE和REGEXP之间有一个重要的差别,LIKE匹配整个列,如果被匹配的文本仅在 ...
- 如何根据执行计划,判断Mysql语句是否走索引
如何根据执行计划,判断Mysql语句是否走索引
- 让dede运行php代码和mysql语句
一.dede运行php代码 举例1: {dede:name runphp='yes'} $str = "hello ";@me = $str;@me .= "world& ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值
Thinkphp用exp表达式执行mysql语句,查询某字段不为空is not null,自动增值 Thinkphp 的文档经常不够完整的表达MYSQL的各种组合,is not null在thinkp ...
- MySQL语句进行分组后的含有字段拼接方法
MySQL语句: SELECT GROUP_CONCAT(DISTINCT transaction_no) FROM `lm_wh_trans` GROUP BY staff_code; 如果tran ...
- shell脚本循环执行mysql语句
参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...
随机推荐
- STM8S103F3P6 开发环境笔记
STM8S103F3 产品手册 https://www.st.com/resource/en/datasheet/stm8s103f2.pdf 内核 16 MHz advanced STM8 core ...
- MySQL性能优化 - 别再只会说加索引了
MySQL性能优化 MySQL性能优化我们可以从以下四个维度考虑:硬件升级.系统配置.表结构设计.SQL语句和索引. 从成本上来说:硬件升级>系统配置>表结构设计>SQL语句及索引, ...
- 解析Java-throw抛出异常详细过程
摘要:Java有3种抛出异常的形式:throw.throws.系统自动抛异常. 本文分享自华为云社区<Java-throw异常详解以及过程>,作者: gentle_zhou . 首先,我们 ...
- Doker从0-1
1.docker思想: 它是一种集装箱的思想,,在以前我们部署一个项目上线的时候,我们要部署各种各样的环境.配置.依赖等,各种各样的环境的配置是十分麻烦的,所以就有了docker.他就是将我们的项目和 ...
- kernel 劫持seq_operations && 利用pt_regs
kernel 劫持seq_operations && 利用pt_regs 劫持seq_operations进行栈迁移 seq_operations是一个大小为0x20的结构体,在打开/ ...
- .NET 6 从0到1使用Docker部署至Linux环境
前言 作为一名.Net菜鸟开发者,平时对Linux接触的并不多,项目部署这一块都是运维小哥顶着,但是作为混迹在云原生项目组的人咱也不能什么都不知道,该掌握的知识还是要懂的,所以借着这次机会,梳理一下项 ...
- ML第4周学习小结
本周收获 总结一下本周学习内容: 1.学习了<深入浅出Pandas>的第五章:Pandas高级操作的两个内容 添加修改数据 高级过滤 我的博客链接: Pandas:添加修改.高级过滤 2. ...
- ptorch常用代码梯度篇(梯度裁剪、梯度累积、冻结预训练层等)
梯度裁剪(Gradient Clipping) 在训练比较深或者循环神经网络模型的过程中,我们有可能发生梯度爆炸的情况,这样会导致我们模型训练无法收敛. 我们可以采取一个简单的策略来避免梯度的爆炸,那 ...
- python常用标准库(os系统模块、shutil文件操作模块)
常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...
- SpringCloud 配置管理:Nacos
目录 统一配置管理 配置热更新 配置共享 多环境配置共享 多服务配置共享 统一配置管理 将配置交给 Nacos 管理的步骤: 在 Nacos 中添加配置文件. 在微服务中引入 nacos 的 conf ...