相关推荐recommended
【业务功能篇07】Mysql 模糊查询
作者:mmseoamin日期:2023-12-20

业务场景:我们对不同的业务逻辑进行数据处理时,多数是离不开需要模糊匹配的时候,比如要获取该表某个字段中,含有某个具体的字符内容,过滤出业务想要的数据。

 这里介绍有这么几种:

一、MySQL通配符模糊查询(%,_)

 通配符的分类

  • "%" 百分号通配符: 表示任何字符出现任意次数 (可以是0次)。
  • "_" 下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然,也可以like "陈____",数量不限。
  • like操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较;但如果like后面没出现通配符,则在SQL执行优化时将 like 默认为 “=”执行

    注意: 如果在使用like操作符时,后面没有使用通用匹配符(%或_),那么效果是和“=”一致的。在SQL执行优化时查询优化器将 like 默认为 “=”执行,SELECT * FROM movies WHERE movie_name like 'A';只能匹配movie_name=“A”的结果,而不能匹配像“AA”或“AB”这样的结果.

     

 

举例:

-- 模糊匹配含有“智能”字的数据

SELECT * from app where PROF like '%智能%';

-- 模糊匹配以“智能”字结尾的数据,  开头则是 '智能%'

SELECT * from app where PROF like '%智能';

-- 查询以“会”为结尾的,长度为三个字的数据,如:"生日会", 两个下划线

SELECT * from dF where a like '__会';

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

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

SELECT * from appF where INSTR(`app`, '%') > 0;
 
SELECT * from appF where LOCATE('%', `app`) > 0;
 
SELECT * from appF where POSITION( '%' IN `app`) > 0;

三个内置函数很类似,这里就介绍 instr

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

实例:

-- 用INSTR关键字进行模糊匹配,功能跟like一样 ,等同于:"like '%智能%'"

SELECT * from app where INSTR(`PROF`, '智能');

 

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

REGEXP 不支持通配符"%、_",支持正则匹配规则

【业务功能篇07】Mysql 模糊查询,第1张

-- REGEXP '智能' 等同于 like '%智能%'

SELECT * from app where appName REGEXP '智能';
-- 等同于
SELECT * from app where appName like '%智能%';

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

SELECT * from app where appName REGEXP '中国|互联网|大学';

 更多技巧细节,参考:https://blog.csdn.net/qq_46940224/article/details/125031647