MySQL模糊查询用法大全(正则、通配符,看完就能找到工作

SELECT * from app_info where appName = ‘网’;

– 等同于

SELECT * from app_info where appName like ‘网’;

– 模糊匹配含有“xxx网xxx车xxx”的数据,如:“途途网约车司机端、网络约车平台”

SELECT * from app_info where appName like ‘%网%车%’;

2) _ 通配符:

– 查询以“网”为结尾的,长度为三个字的数据,如:“链家网”,

SELECT * from app_info where appName like ‘__网’;

注意:‘%__网、__%网’  等同于 ‘%网’

– 查询前三个字符为XX网,后面任意匹配,如:“城通网盘、模具网平台”

SELECT * from app_info where appName like ‘__网%’;

– 模糊匹配含有“xx网x车xxx”的数据,如:“携程网约车客户端”

SELECT * from app_info where appName like ‘__网_车%’;

注意事项:

  1. 注意大小写,在使用模糊匹配时,也就是匹配文本时,MySQL默认配置是不区分大小写的。当你使用别人的MySQL数据库时,要注意是否区分大小写,是否区分大小写取决于用户对MySQL的配置方式.如果是区分大小写,那么像Test12这样记录是不能被"test__"这样的匹配条件匹配的。
  1. 注意尾部空格,"%test"是不能匹配"test "这样的记录的。
  1. 注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是说SELECT * FROM blog where title_name like ‘%’;是匹配不到title_name为NULL的的记录。

1-3. 技巧与建议:


正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长,消耗更多的内存等资源。这里给出一些使用通配符要记住的技巧。

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。

  • **在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。**因为MySQL在where后面的执行顺序是从左往右执行的,如果把通配符置于搜索模式的开始处(最左侧),搜索起来是最慢的(因为要对全库进行扫描)。

  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

有细心地朋友会发现,如果数据中有“%”、“_”等符号,那岂不是和通配符冲突了?

SELECT * from app_info where appName LIKE ‘%%%’;

SELECT * from app_info where appName LIKE ‘%_%’;

确实如此,上面面两条SQL语句查询的都是全表数据,而不是带有"%“和”_"的指定数据。这里需要加 ESCAPE 关键字进行转义。

如下,ESCAPE 后面跟着一个字符,里面写着什么,MySQL就把那个符号当做转义符,一般我就写成"/";然后就像 C语言中转义字符一样 例如 ‘\n’,’\t’, 把这个字符写在你需要转义的那个%号前就可以了;

SELECT * from app_info where appName LIKE ‘%/_%’ ESCAPE ‘/’;

但是这种情况有没有更高端点的解决办法呢?能让检查你代码的同事或领导对你刮目相看那种~~

当然,下面我们就来看看MySQL的第二类模糊匹配方式 — 内置函数查询

二、MySQL内置函数检索(locate,position,instr)

====================================

话接上文,通过内置函数locate,position,instr进行匹配,相当于Java中的str.contains()方法,返回的是匹配内容在字符串中的位置,效率和可用性上都优于通配符匹配。

SELECT * from app_info where INSTR(appName, ‘%’) > 0;

SELECT * from app_info where LOCATE(‘%’, appName) > 0;

SELECT * from app_info where POSITION( ‘%’ IN appName) > 0;

如上,三种内置函数默认都是:> 0,所以下列 > 0 可加可不加,加上可读性更好。

OK,下面一起来看看这三种内置函数的使用方法吧。

先明确一下,MySQL中的角标从左往右是从1开始的,不像java最左边第一位角标是0,因此在MySQL中角标为0时说明不存在。

2-1. LOCATE()函数


语法: LOCATE(substr,str)

返回 substr 在 str 中第一次出现的位置。如果 substr 在 str 中不存在,返回值为 0,如果substr 在 str 中存在,返回值为:substr 在 str中第一次出现的位置。

注意:LOCATE(substr,str)与 POSITION(substr IN str)是同义词,功能相同。

语法: LOCATE(substr, str, [pos])

从位置pos开始的字符串str中第一次出现子字符串substr的位置。 如果substr不在str中,则返回0。 如果substr或str为NULL,则返回NULL。

SELECT locate(‘a’, ‘banana’);       – 2

SELECT locate(‘a’, ‘banana’, 3);    – 4

SELECT locate(‘z’, ‘banana’);       – 0

SELECT locate(10, ‘banana’);        – 0

SELECT locate(NULL , ‘banana’);     – null

SELECT locate(‘a’ , NULL );         – null

实例:

– 用LOCATE关键字进行模糊匹配,等同于:“like ‘%网%’”

SELECT * from app_info where LOCATE(‘网’, appName) > 0;

– 用LOCATE关键字进行模糊匹配, 从第二个字符开始匹配"网",则"网易云游戏、网来商家"等数据就被过滤了

SELECT * from app_info where LOCATE(‘网’, appName, 2) > 0;

2-2. POSITION()方法


语法:POSITION(substr IN substr)

这个方法可以理解为locate(substr,str)方法的别名,因为它和locate(substr,str)方法的作用是一样的。

实例:

– 用POSITION关键字进行模糊匹配,等同于:“like ‘%网%’”

SELECT * from app_info where POSITION( ‘网’ IN appName);

2-3. INSTR()方法


语法: INSTR(str,substr)

返回字符串str中第一次出现子字符串substr的位置。INSTR()与LOCATE()的双参数形式相同,只是参数的顺序相反。

实例:

– 用INSTR关键字进行模糊匹配,功能跟like一样 ,等同于:“like ‘%网%’”

SELECT * from app_info where INSTR(appName, ‘网’);

– instr函数作用,一般用于检索某字符在某字符串中的位置,等同于:“like ‘%网%’”

SELECT * from app_info where INSTR(appName, ‘网’) > 0;

三、MySQL基于regexp、rlike的正则匹配查询

============================

MySQL中的regexp和rlike关键字属于同义词,功能相同。本文以regexp为准。

REGEXP 不支持通配符"%、_",支持正则匹配规则,是一种更细力度且优雅的匹配方式,一起来看看吧

– 这里给出regexp包含的参数类型

参数类型作用
(^)匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。
($)匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串。
(.)这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。
(*)星号匹配0个或多个字符,在它之前必须有内容。如:select * from table where name regexp 'ba*'(可以命中“baaa”)
(+)

加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。

(?)问号匹配0次或1次。
{n}匹配指定n个
{n,}匹配不少于n个
{n,m}匹配n-m个

– REGEXP ‘网’ 等同于 like ‘%网%’

SELECT * from app_info where appName REGEXP ‘网’;

– 等同于

SELECT * from app_info where appName like ‘%网%’;

3-1. regexp中的 OR : |


功能:可以搜索多个字符串之一,相当于 or

– 支持 “|” ‘或’符号,匹配包含“中国”或“互联网”或“大学”的数据,支持叠加多个

SELECT * from app_info where appName REGEXP ‘中国|互联网|大学’;

– 匹配同时命中“中国”、“网”的数据可以用".+"连接,代表中国xxxx网,中间允许有任意个字符,顺序不能反。

SELECT * from app_info where appName REGEXP ‘中国.+网’;

3-2. REGEXP中的正则匹配 : []


功能:匹配[]符号中几个字符之一,支持解析正则表达式

– 匹配包含英文字符的数据,默认不区分大小写情况下

SELECT * from app_info where appName REGEXP ‘[a-z]’;

– 跟like一样,取反集加 “not REGEXP” 即可,下面不再赘述

SELECT * from app_info where appName not REGEXP ‘[a-z]’;

匹配包含大写英文字符的数据,默认忽略大小写,需要加上"BINARY"关键字。如where appName REGEXP BINARY ‘Hello’

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

SELECT * from app_info where appName REGEXP BINARY ‘[A-Z]’;

– 匹配包含数字的数据

SELECT * from app_info where appName REGEXP ‘[0-9]’;

– 匹配包含数字或英文的数据,

SELECT * from app_info where appName REGEXP ‘[a-z0-9]’;

a-z、0-9都认定为一个单位,不要加多余符号,前两天就发现了一个特殊情况,很有意思的bug,跟他家分享一下

– 之前写查询语句时多加了"|“符号,以为是"或”,没有在意,但万万没想到,查出数量竟不同

SELECT * from app_info where appName REGEXP ‘[567]’; – 87条

SELECT * from app_info where appName REGEXP ‘[5|6|7]’; – 88条

一头雾水,赶快看看差得是哪一条

– 原来"|"符号也参与到了匹配中,认定为一个单位。巧的是有一个数据为:“无线调音台 | Wireless Mixer” 这个正好匹配上。卧槽了个DJ

SELECT * from app_info where appName REGEXP ‘[5|6|7]’ and pid not in (SELECT pid from app_info where appName REGEXP ‘[567]’);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

image

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!
-G0scQjBG-1711573365723)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

[外链图片转存中…(img-2kSD6ON0-1711573365724)]
[外链图片转存中…(img-GQV7nmt1-1711573365725)]

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
[外链图片转存中…(img-9yZR1qPo-1711573365725)]

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

[外链图片转存中…(img-fjX4nl9Z-1711573365725)]

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值