MySQL提供标准的SQL模式匹配,以及一种基于像Unix实用程序,如:vi、grep和sed的扩展正则表达式模式匹配的格式

一、SQL模式(% ,_)

  SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在MySQL中,SQL的模式缺省是忽略大小写的。

  注意:在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

  语法:SELECT 字段 FROM 表 WHERE 某字段 Like 条件

  其中关于条件,SQL提供了两种匹配模式:

  1、百分号(%):表示任意个或多个字符。可匹配任意类型和长度的字符。

  示例1:

SELECT * FROM character WHERE name LIKE ‘%孙%';
即匹配姓名为“孙行者”,“行者孙,“行者孙”等包含“孙”类型的数据

  示例2:

SELECT * FROM character WHERE name LIke '%孙%' and name like '%行%';
即匹配姓名为“孙行者”,“行者孙,“行者孙”等包含“孙”和“行”的数据

  示例3:

SELECT * FROM character WHERE name LIke '%孙%行%‘;
只能匹配姓名为“孙行者”等类似“...孙...行...”的数据

  2、下划线(_):表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)

  示例1:

SELECT * FROM character WHERE name LIKE ‘_三_';
即匹配姓名为“..三..”类型的数据,前后均只有一个字符

  示例2:

SELECT * FROM character WHERE name LIKE ‘_三';
即匹配姓名类似“...三”类型的数据,前面有且只有一个字符

  

二、正则模式

  正则表达式作用是匹配文本,将一个模式(正则表达式)与一个文本穿进行比较。

  MySQL用where子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SELECT检索出的数据。

  1、MySQL正则表达式仅仅使SQL语言的一个子集,可以匹配基本的字符、字符串。

select * from wp_posts where post_name REGEXP 'hello';
可以检索出列post_name中所有包含hello的行

  2、.匹配除\n之外的任意单个字符

select * from wp_posts where post_name REGEXP '.og';
注:.是正则表达式中的一个特殊字符。它表示匹配一个字符,因此bog,cog,dog等等都能匹配。

  注意:

  关于大小写的区分:MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写。

  如果要区分大小写,应该使用BINARY关键字,例如:

where post_name REGEXP BINARY 'Hello .000'

  3、^匹配字符串开始位置,如查询所有姓王的人名

select name from 表名 where name REGEXP '^王';

  4、$匹配字符串结束位置,如查询所有姓名末尾是“明”的人名

select name from 表名 where name REGEXP '明$';

  5、进行OR匹配

  为搜索两个串之一(或者这个串,或者为另外一个串),使用|。

  |作为OR操作符,表示匹配其中之一。可以给出两个以上的OR条件。

select * from products where pro_id REGEXP '1000|2000';
这样就1000和2000都能匹配并返回,当然,使用多个|就可以匹配多个串

  6、[ ]匹配任何单一字符,是另一种形式的OR语句,可缩写的OR语句

  例如,匹配范围:[0123456789]可以匹配0到9,[1-4][4-9]也是合法的范围。

  此外,范围不一定只是数值的,[a-z]匹配任意字母字符。

  例如,查询出w/z/s开头的人的人名

SELECT prod_name FROM products WHERE prod_name REGEXP '^[wzs]';

  7、[^....]匹配不包含在[ ]的字符,如查询出chenmin之外的人名

SELECT prod_name FROM products WHERE prod_name REGEXP '^[wzs]';

  注:^的双重用途:在集合中(用[ ]定义),它用来否定该集合。否则,用来指串的开始

  8、匹配特殊字符使用\\进行转义

  \\为前导。即转义,正则表达式内具有特殊意义的所有字符都必须以这种方式转义。

(1)\\-   表示查找-
(2)\\. 表示查找.
(3)\\f 表示换页
(4)\\n 表示换行
(5)\\r 表示回车
(6)\\t 表示制表
(7)\\v 表示纵向制表

  注:为了匹配\本身,需要使用\\\

  9、匹配字符类

(1)[:alnum:]    任意字母和数字(同[a-zA-Z0-9])
(2)[:alpha:] 任意字符(同[a-zA-A])
(3)[:blank:] 空格和制表符(同[\\t])
(4)[:digit:] 任意数字(同[0-9])
(5)[:lower:] 任意小写字母(同[a-z])
(6)[:upper:] 任意大写字母(同[A-Z])
(7)[:space:] 包括空格在内的任意空白字符(同 [\\f\\n\\t\\r\\v])
(8)[:cntrl:] ASCII控制字符(ASCII 0到31和127)
(9)[:graph:] 与["print:]相同,但不包括空格
(10)[:print:] 任意可打印字符
(11)[:punct:] 既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符
(12)[:xdigit:] 任意十六进制数字(同 [a-fA-F0-9])

  10、匹配多个示例,关于重复元字符

元字符              说明
* 0个或多个匹配
+ 1个或多个匹配(等于 {1, })
? 0个或1个匹配(等于 {0, 1})
{n} 指定数目的匹配
{n, } 不少于指定数目的匹配
{n ,m} 匹配数目的范围(m不超过255)

  例子:

select prod_name from products where prod_name REGEXP '[[:DIGIT:]]{4}';
如前所述,[:digit:]匹配任意数字,因而它为数字的一个几何。
[[:digit:]]{4}匹配连在一起的任意4位数字,当然,上面的例子也可以这样写REGEXP '[0-9][0-9][0-9][0-9]'

  11、定位符

^         文本的开始
$ 文本的末尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

  注:like匹配整个串,而REGEXP匹配子串。

三、in查询

  叫in查询不是很合理,更合理的说法是:in其实和=类似,区别在于:=后面是一个值。in后面可以是多个值。

  示例1:

select * from role where name in("唐三");
即匹配姓名为“唐三”一行数据;

  示例2:

select * from role where name in("唐三","唐三藏");
即匹配姓名为“唐三”,“唐三藏”一行数据;

  示例3:

select * from role where name in("唐三","%行者%")
只匹配姓名为“唐三”一行数据;即in查询不支持模糊查询,如示例4

  示例4:

select * from role where name in("%行者%")
无匹配结果

  

四、like contact模糊查询

  CONCAT(str1,str2,…) 函数返回结果为连接参数产生的字符串。

select * from role where name like contact("%","三","%");
即匹配姓名为“唐三”,“唐三藏”等类型的数据数据;

  like contact模糊查询强大的地方在于可以对传进来的参数进行某查询,比如经前端提交上的数据,赋值给参数name,则可以select * from table where name like contact("%",${name},"%")

MySQL模糊匹配查询like、regexp、in的更多相关文章

  1. mysql学习2:模糊匹配查询like,regexp,in

    mysql模糊匹配查询like,regexp,in   摘要 内容比较简单,无摘要.   关键词 模糊查询  like  regexp  in  contact   正文 下图是示例用到的数据表信息 ...

  2. mysql模糊匹配like及批量替换replace

    1.mysql 模糊匹配 like 与 not like 用法 : SELECT * FROM `user` where `nickname` LIKE '%测试%' SELECT * FROM `u ...

  3. Mysql 模糊匹配和转义字符

    首先创建一个测试表: insert into test(tt) values('\\\\172.18.28.153'); 现在我想使用模糊匹配,查出以 “\\172” 开头的字符串. 需要使用like ...

  4. Oracle和Mysql中mybatis模糊匹配查询区别

    1.Oracle AND NAME LIKE '%'||#{name}||'%' 2.Mysql AND NAME LIKE "%"#{name}"%"

  5. mysql模糊匹配

    select * from tableName where column like ""; select * from tableName where column regexp ...

  6. Mysql 模糊匹配(字符串str中是否包含子字符串substr)

    1.LIKE 通常与 % 一同使用,类似于一个元字符的搜索.若substr不在str中,则返回0. 2.INSTR(str,substr) 返回字符串 str 中子字符串的第一次出现位置.若subst ...

  7. mySql一个字段的值模糊匹配多表多列的查询

    1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...

  8. 转:使用Mongo Connector和Elasticsearch实现模糊匹配

    原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connec ...

  9. jq模糊匹配

    jq是一般程序员在前台开发的时候都会使用的技术,其中模糊匹配查询在动态添加标签的时候经常用到,这里我写出我经常用到的几个模糊匹配的方法.其中有:^(前缀).$(后缀).*(包含)例如有这样一段代码: ...

随机推荐

  1. 解决sqlserver数据库表空间不自动释放问题

    在项目中遇到了sql server数据库经过频繁地删减数据后,查询变慢的问题. 我把数据导到另一个库中,发现查询就很快. 查了下原因,根本原因是删除数据并不释放表空间,日志文件太过巨大的原因. 网上查 ...

  2. C++反汇编(一)

    对象/结构体 对象的大小只包括数据成员,成员函数属于执行代码. 对象长度 = sizeof(数据成员1) + sizeof(数据成员2) + ...... + sizeof(数据成员n) 特殊情况公式 ...

  3. angular-repeat

    ng-repeat="name in 变量名字 track by $index" 一个数组的时候ng-repeat="name in 变量名字" {{x.nam ...

  4. hbuilder下用plus.barcode.Barcode做二维码扫描,当二维码容器的高度设置过低时,启动扫描会发生闪退

    解决办法: 将固定高度改为百分比

  5. 推导正交投影(Orthographic Projection)

    定义六个面 left right bottom top near far   然后三个轴分开考虑 x轴 视椎体的x范围在[l,r],我们要变换到[-1,1] 1 减去l变换到[0, r-l] 2 乘以 ...

  6. Flutter介绍 - Flutter,H5,React Native之间的对比

    Flutter介绍 Flutter是Google推出的开源移动应用开发框架.开发者可以通过开发一套代码同时运行在iOS和Android平台. 它使用Dart语言进行开发,并且最终编译成各个平台的Nat ...

  7. 使用Nginx+Uwsgi部署Python Flask项目

    第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...

  8. 面试官问我,使用Dubbo有没有遇到一些坑?我笑了。

    前言 17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍. 根据我的面试经验 ...

  9. Vmware12 u盘启动系统

    先插U盘,再打开虚拟机 创建一个虚拟机 点击添加硬盘,下一步 先择SCSI,下一步 选择如图所示,有可能是1,也可能是2,这项就是U盘 设置完毕后,打开虚拟机,赶紧按F2,ESC 或者F12,这个是看 ...

  10. Ubuntu18.04版本设置root账户

    Linux系统下文件的权限十分重要,大多数操作都需要一定的权限才可以操作,Ubuntu18.04默认安装是没有设置root账户的,因此想要获得root账户登录可以使用以下步骤:   1.首先获得临时的 ...