原标题:Mysql必知必会——使用正则表达式搜索(REGEXP)

本文主要介绍如何在 Mysql 中使用正则表达式进行搜索。

正则表达式是一个非常大的内容,我会在之后专门写博客介绍,这里只是简介一些常用匹配模式

博客文章地址:

简介

之前几篇文章讲解了各种各样的过滤数据条件,通过这些条件,我们已经能够满足日常开发中大部分的工作。但假设筛选条件更加复杂一点,比如你的老板叫你从邮箱+手机号码混合注册的用户中找出手机号码注册用户,要给他们发送营销短信。这时,之前的过滤方法就不太奏效。正则表达式搜索就派上大用场。

简单来说,正则表达式就是用来匹配文本的特殊字符串。比如,从文本中提取电话号码,带数字的用户名,或者提取某个特定格式的文本。

而且所有语言编辑器基本上都支持正则表达式,不得不说,正则表达式已经成为开发过程中强大而有力的工具。Mysql 也不例外,那么就开始正式学习这种特殊匹配方式。

本文所用到的 Mysql 表在文章最后的附录。

匹配字符串

匹配字符串是正则表达式最基础的应用。我们先给出一个例子:我们从一个用户表中查询出名字中包含有100数字的用户

SELECT * FROM my_user WHERE `name` REGEXP '100';

我们得到了用户ID为1的用户:小红100

该语句中不同于之前的语句,我们使用REGEXP关键字代表后面为正则表达式

这条语句看起来和LIKE语句特别相似,而且也是可以使用LIKE语句来实现。那使用正则表达式的意义何在?

原因很简单。假设,我现在需要匹配不仅仅是包含100数字的用户,而是100,200,或者300,只要是整百的都需要匹配。或者说,我需要所有名字里面包含数字的,无论什么数字。那么使用LIKE来实现就会显得十分的困难。而正则表达式就会显得十分简单。

SELECT * FROM my_user WHERE `name` REGEXP '.00'; // 匹配包含整百的名字,如100,200,300等等

表达式.00里面的点,代表的任意字符。也就是无论是1还是2还是9,或者是字母什么的都可以匹配,匹配任意。

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]'; // 匹配所有名字里面包含数字的用户

是不是来的比LIKE简单得多?上面的表达式,我们在接下来就会详细阐述。

正则和模糊查询的区别

那么我们什么情况下应该使用LIKE?什么情况下又适合使用正则表达式查询?

这里我们只需要记住LIKE查询和正则查询非常重要的差别即可。

先看两个例子:

1、之前的一条语句

SELECT * FROM my_user WHERE `name` REGEXP '100';

2、LIKE查询的实现

SELECT * FROM my_user WHERE `name` LIKE '100';

这里我们可以清楚的看到两者的区别:正则表达式返回了一条记录,而LIKE查询没有匹配到任何记录

结论:LIKE查询匹配整个列,如果需要匹配的字符串(比如上面的100)包含在列中,那么则无法匹配成功。而正则匹配则可以匹配列值内部的值,简单来说就是它会从第一个字符开始往后匹配,只要匹配有一个成功那么就会返回记录。这是两者重要的区别。

那么正则匹配是否也可以匹配整个字符,当然可以。不过需要涉及到另外的知识:定位符^和$,下面将会作详细解释。

使用或查询

如果正则表达式仅仅就是和LIKE有那么一点儿的差别,也就不会有这么高的地位了。下面才是显示身手的时候。

或查询也叫OR查询,是条件并列查询的一种情况。类似于编程语言里面的if else只要有一个条件符合就会被匹配。

SELECT * FROM my_user WHERE `name` REGEXP '100|200';

上面的语句查询了名字中包含了100或者200数字的用户,就是说两个数值只要匹配一个就可以返回数据。

当然你也可以给出多个或情况,他们之间使用竖线分割即可。比如:100|200|300|400

使用或查询的情况,有点儿类似于SELECT中使用OR条件连接的情况,你可以把它们想象成并入了一个正则表达式。

匹配多个字符之一

正则匹配中有一种特殊的OR匹配。

SELECT * FROM my_user WHERE `name` REGEXP '[12]';

上面表达式中我们使用了一个特殊的字符串[12],这个字符串的含义是:查询名字中包含有数字1或者数字2的记录,它是[1|2]的缩写。

这种,使用方括号将字符串括起来的写法,无论方括号内有多少字符串,其表达的含义都是匹配其中任意一个。

如果是[123456789]那么就代表,匹配名字中包含1或2或3或4或5或6或7或8或9的任何一个记录。

当然,字符串还可以查询被否定的情况。[^12]如果在12之前加上一个^符号,那么就代表除了1或2外的字符串。

SELECT * FROM my_user WHERE `name` REGEXP '[^12]';

说明:表中小红100,虽然包含1,但是他包含了0。0不属于1或者2,所以被匹配。

匹配一个范围

看下我们上面有个集合[123456789],如果每次我们写正则时候都这么写,那么岂不是很麻烦。所以,我们可以简化这种情况,使用一个范围[1-9]来代替这串字符串。如果是匹配所有数字,那么就会包含0,我们可以使用[0-9]来表示。

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';

这个表达式将会匹配出所有名字中包含数字的记录。拆开理解就是,包含0或者1或者2…或者8或者9的记录。

而且,这里的范围不仅仅只能是数字,还可以是字母。比如[a-z]就是表示从字母a到字母z的所有数字,26个字母。小写完了,还有大写[A-Z]。那么我们将其组合起来[0-9a-zA-Z]这个表达式就十分强大了,可以表示包含数字,小写字母,大写字母的所有记录。

SELECT * FROM my_user WHERE `name` REGEXP '[0-9a-zA-Z]';

由于我名字里面没有包含字母的,所以结果和上面[0-9]相同。

匹配特殊字符串

我们来看下下面的一条语句:

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]';

这个语句的意思是匹配名称包含所有数字的记录。0-9被方括号扩了起来,那么假设我现在就需要匹配方阔号该如何处理?

这个时候就需要用到匹配特殊字符的知识。为了匹配这些特殊的字符,我们需要使用转义功能,就是使用(双反斜杠)作为前导。假设我们需要匹配常用特殊字符即可这么写:

[ 匹配左方括号. 匹配点号] 匹配右方括号| 匹配竖线 匹配反斜杠自己本身

依次类推,其他特殊的字符串也可以使用这么方式处理。

双反斜杠加上一些字母还可以表示特殊的含义。

比如:

f 换页n 换行r 回车t 制表符v 纵向制表符

在一般的编程语言中,转义一般使用一个反斜线,在 Mysql 中为什么是两个才行?原因是:Mysql 自己需要一个来识别,然后 Mysql 会将扣除了一个反斜杠的剩余的部分完全的交给正则表达式库解释,所以加起来就是两个了。

使用预定义字符集

虽然正则表达式提供了一些很长表示方式的缩写,比如[0-9]表示数字。[a-z]表示小写字母。但是,有些时候还是觉得复杂。所以,正则表达式还提供了一些预定义的字符类来方便我们开发。

简单来说,就像车牌使用苏代表江苏,而沪代表上海一样。

我们直接给出表直接参阅。

元字符

之前匹配的内容都是单词匹配。就是如果匹配到一次就显示,匹配不到就不显示。但是,复杂的情况有时候要求匹配不止一次。假设我需要匹配名字中包含2-3位数字的记录。这个时候就需要使用一种特殊的元字符来修饰。

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]{2,3}';

是不是非常简单?下面具体解释它的用法。

拿出这个特殊字符串[0-9]{2,3},除去前面的[0-9]后面的{2,3}就被成为重复元字符,它的作用就是使得前面的数字重复一定的次数。

元字符

作用

*

重复0次或者多次

+

重复一次或者多次。相当于{1,}

?

重复0次或者1次

{n}

重复n次

{n,}

重复至少n次

{n,m}

重复n-m次SELECT * FROM my_user WHERE `name` REGEXP

'[0-9]*';

// 匹配名字包含或者不包含数字的记录

SELECT * FROM my_user WHERE `name` REGEXP '[0-9]{2,3}'; // 匹配名字内包含2位数或者3位数的记录

定位元字符

除了之前的重复元字符,正则还有一种特殊的定位元字符

元字符

作用

^

文本开始

$

文本结尾

[[:<:>

词的开始

[[:>:]]

词的结尾

还记得之前区别LIKE和正则表达式的例子么?LIKE是对整个字符串进行匹配,而正则是匹配到就可以。

如果现在我们需要在邮箱+手机号码混合注册的账号中,挑选出手机号码,那么我们就要对账号进行从头到尾的匹配。

比如手机号码是11位数字,也就是说a11111111111不行,但是他又具备11个数字条件。

所以我们要求从头开始匹配到结尾,是11位数字。

SELECT * FROM my_user WHERE `name` REGEXP '^[0-9]{11}$';

为了匹配到内容,我在数据库内又加了一条记录。

匹配结果

附录:用户表 SET FOREIGN_KEY_CHECKS= 0;-- ------------------------------ Table structure formy_user-- ----------------------------DROP TABLE IF EXISTS `my_user`;CREATE TABLE `my_user` ( `user_id` int( 11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar( 30) NOT NULL, `age` tinyint( 2) NOT NULL DEFAULT '0', `password` varchar( 40) NOT NULL, `code` varchar( 10) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB AUTO_INCREMENT= 7DEFAULT CHARSET=utf8;-- ------------------------------ Records of my_user-- ----------------------------INSERT INTO `my_user` VALUES ( '1', '小红100', '20', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2arfs5dr6m');INSERT INTO `my_user` VALUES ( '2', '小明200', '19', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'd59tg6dr5h');INSERT INTO `my_user` VALUES ( '3', '小黄350', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'w56tg9hjn3');INSERT INTO `my_user` VALUES ( '4', '小颖410', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'a5d23e9yh5');INSERT INTO `my_user` VALUES ( '5', '星空幻颖', '22', '7c4a8d09ca3762af61e59520943dc26494f8941b', '86d2sadft9');

星空幻颖,严颖

个人主页:

【热门阅读】

SegmentFault -

墨白 -

Abact -

matianming -

海岛心hey -

橘子小睿 -

林湾村龙猫 -

责任编辑:

mysql not regexp_Mysql必知必会——使用正则表达式搜索(REGEXP)相关推荐

  1. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  2. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  3. mysql正则表达式关键字_《MySQL必知必会》正则表达式

    <MySQL必知必会>正则表达式 正则表达式 1.1.关键字 REGEXP 正则表达式的使用需要用到关键字 REGEXP . select prod_name from products ...

  4. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结

    本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...

  5. MYSQL必知必会学习笔记(二)

    MYSQL必知必会四-五章--检索.排序 书中部分代码展示: ##第四第五章 SELECT prod_name FROM products; /*从products表中检索一个叫prod_name的列 ...

  6. mysql必知必会学习笔记(一)

    MYSQL必知必会第三章--了解数据库和表 书中部分代码展示: CREATE DATABASE crashcourse; /*创建名为 crashcourse 的新数据库*/SHOW DATABASE ...

  7. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 使用Select语句返回的数据,可能会发现显 ...

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

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

  9. mysql必_MySQL必知必会(一)

    摘自<MySQL必知必会> 1.1.1 什么是数据库 数据库:保存有组织的数据的容器(通常是一个文件或一组文件) 人们通常用数据库这个术语来代表他们使用的数据库软件.这是不正确的,它是引起 ...

  10. mysql中用完即删用什么_MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机--服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

最新文章

  1. 30年间,软件开发行业为何Bug纷飞?
  2. STM32串口接收数据
  3. java c s 与b s架构结合使用_Java技术学习笔记:C/S 与B/S 区别
  4. 利用zookeeper实现发布订阅模式
  5. 如何实现下拉框的绑定
  6. 5、maplotlib中的轴刻度和轴线
  7. dualbootpatcher下载_多系统软件Dual Boot Patcher教程(多图)
  8. 计算机软考深圳积分,2020年软考证书能为深圳积分入户加分吗?
  9. 2021-12-11 【数据结构平时实验】【图】
  10. D类放大器工作原理详解
  11. 数据结构与算法基本概念
  12. Nerv - 京东高性能前端框架
  13. 生活妙招:疏通蹲便器和地漏中的头发堵塞
  14. 决策树 基于python实现ID3,C4.5,CART算法
  15. 报名系统网页导出html,教资报名系统提示网站兼容性怎么办 ie浏览器兼容性操作流程...
  16. Mac电脑忘记管理员密码与忘记登陆密码处理(开机/恢复出厂设置/重置)
  17. HashMap的四种遍历方法,及效率比较(简单明了)
  18. 大华城市安防监控系统平台管理存在任意文件下载漏洞
  19. Spring学习(1)
  20. 探索神经网络的奥秘:如何优化模型和提高训练速度

热门文章

  1. Hbase教程(一) Hbase入门教程
  2. devc ++的安装教程(C语言学习比较好用的一个开发软件)
  3. 图像分割各种评测标准
  4. linux进程管理实验视频,Linux进程管理实验
  5. Python深度学习(什么是深度学习)----学习笔记(一)
  6. 直播网站源码H5直播入门(理论篇)
  7. Python设计模式:外观模式
  8. Python基础代码大全,都在这里了,初学者必看
  9. java并发包并发队列
  10. VsCode 中 vue代码格式化 (整理代码)