《MySQL必知必会》正则表达式

正则表达式

1.1、关键字 REGEXP

正则表达式的使用需要用到关键字 REGEXP

select prod_name
from products
where prod_name regexp '1000';

从效果看和关键字 LIKE 有相似之处。但只从这个例子中看不出差别,而且使用正则表达式还会降低性能。

但是如果用 LIKE 替换上面的句子,是查询不到数据的。

因为 LIKE 是匹配整个列内的全文本才会返回数据,要想做到和 REGEXP 一样的效果,要使用通配符或者拼接函数才行。


正则表达式是需要配合起来使用才能看到它的扩展性。

select prod_name
from products
where prod_name regexp '.000';

. 在正则表达式中表示任意一个字符。

以上例子使用的是数字匹配,要知道 MySQL 3.23.4+ 正则表达式匹配都是不区分大小写的。

1.2、OR 匹配 ‘ | ’

select prod_name
from products
where prod_name regexp 'ton|1000|2000';

使用 | 可以起到 or 的作用,要注意,不要有多余的空格,将会影响匹配。可以给出两个或两个以上的条件。

1.3、匹配几个字符之一

select prod_name
from products
where prod_name regexp '[125] ton';

用 [ ] 定义一组字符,以上的例子表示匹配 1 2 5 三个字符。注意 ton 前是有一个空格的。匹配的是 ‘1 ton' , '2 ton' ,'5 ton' 这三个字符串。

还有一种写法,是使用 |

select prod_name
from products
where prod_name regexp '[1|2|5] ton';

得到的结果是和上面的一样的。

但是要注意,下面这样写是得不到预期结果的。

select prod_name
from products
where prod_name regexp '1|2|5 ton';

因为上面写法告诉 MySQL ,将匹配 1 , 2 ,5 ton 单个字符串

此外,还可以使用 ^ 来匹配这些字符以外的列。

select prod_name
from products
where prod_name regexp '[^123]';

^ 当然也是不能匹配 NULL 值的列的。

1.4、匹配范围

select prod_name
from products
where prod_name regexp '[1-5] ton';

' - ' 表示范围,1-5,表示1、2、3、4、5 。

a-z 表示任意字母范围。

1.5、特殊字符

上面提到 . 表示任意一个字符,那么如果需要匹配 '.' 要怎么才能让MySQL知道不去转义它?

答案是 反斜杆 \ 。

select prod_name
from products
where prod_name regexp '\\.';

还可以引用元字符:

元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

匹配 \ 需要 \\\ 来表示。

1.6、匹配字符类

1.7、匹配多个实例

select prod_name
from products
where prod_name regexp '\\([1-5] sticks?\\)';

\\( :匹配 ( ;\\) :匹配 )

[1-5] : 匹配数字 1 -5 的范围;

sticks? :需要拆分为 stick 和 s? 来看待,stick :匹配全文

s? : 表示 ? 前面的 s 为匹配0或1个,即为可选。

重复元字符说明如下表:

结合上表匹配字符类的元字符,还可以

select prod_name
from products
where prod_name regexp '[[:digit:]]{4}';

[:digit:] :表示匹配任意数字 ,{4} : 表示出现四次。

当然还可以有其他写法,如下:

select prod_name
from products
where prod_name regexp '[0-9][0-9][0-9][0-9]';

1.8、定位符

定位元字符说明如下:

想找以任意数字作为开头的产品名:

select prod_name
from products
where prod_name regexp '^[1-9]';

想找以任意数字作为结尾的产品名:

select prod_name
from products
where prod_name regexp '[0-9]$';

注意 ^ 的两种用法

用在[ ] 内表示否定该集合,用在 [ ] 外表示文本的开始处。

MySQL必知必会》正则表达式的更多相关文章

  1. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  2. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  3. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  4. mysql 必知必会总结

    以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随 ...

  5. MySql必知必会实战练习(三)数据过滤

    在之前的博客MySql必知必会实战练习(一)表创建和数据添加中完成了各表的创建和数据添加,MySql必知必会实战练习(二)数据检索中介绍了所有的数据检索操作,下面对数据过滤操作进行总结. 1. whe ...

  6. 读《MySql必知必会》笔记

    MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...

  7. MySql必知必会内容导图

    <MySQL必知必会>从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用.子查询.正则表达式和基于全文本的搜索.存储过程.游标.触发器.表约束,等等.通过重点突出的章节,条理 ...

  8. MySQL必知必会1

    MySQL必知必会 ​ 了解SQL 什么是数据库:数据库(database)保存有阻止的数据的容器,可以把数据库想象成一个文件柜. 什么是表:表(table) 某种特定类型结构的结构化清单,数据库中的 ...

  9. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

随机推荐

  1. Android存储--SharedPreferences

    简介 在Android中,主要有以下几种存储方式: SharedPreferences,在键值对中存储私有原始数据. 内部存储,在设备内存中存储私有数据. 官方示例: String FILENAME ...

  2. Java Script 数组

    数组:有许多变量的集合,它们的名称和数据类型都是一致的. 定义    操作(添加修改) Var arr=new Array(): Var arr=[ ]; //定义 Var arr1=[ 1,2,3, ...

  3. Qt自定义控件之仪表盘1--简单的贴图仪表盘

    0.前言 学程序首先要输出hell world,学电子要先来个流水灯.学Qt,那就必须先来个自定义控件,若有人问我从哪个下手,我推荐仪表盘,可简可繁,从低配到高配齐全,可入门也可进阶. 1.仪表盘解析 ...

  4. MacOS下ElasticSearch学习(第一天)

    ElasticSearch第一天 学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"elasticsearch&q ...

  5. Java Udp Socket Simple Demo

    import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...

  6. 删除数据-大表根据rowid来删除部分数据

    偶遇需求,大表中需要删除部分数据.分批删除. declare TYPE type_table_rowid IS TABLE OF ROWID INDEX BY BINARY_INTEGER;table ...

  7. 关于DateTimeOffset的爱恨情仇

    为什么要上DataTimeOffset?因为DateTime无法解决时区问题,经常需要时间戳转换日期,DateTimeOffset就是应运而生,数据格式储存了和UTC的时区差,C#几乎全几乎全版本支持 ...

  8. 解决Vue中element-ui输入框无法输入问题

    <el-input placeholder="请输入内容" v-model="input3" class="input-with-select& ...

  9. 016_go语言中的递归

    代码演示 package main import "fmt" func fact(n int) int { if n == 0 { return 1 } return n * fa ...

  10. 001_go语言中的hello world

    代码演示: package main import "fmt" func main() { fmt.Println("hello world") } 代码解读: ...