业务场景:我们对不同的业务逻辑进行数据处理时,多数是离不开需要模糊匹配的时候,比如要获取该表某个字段中,含有某个具体的字符内容,过滤出业务想要的数据。
这里介绍有这么几种:
通配符的分类
- "%" 百分号通配符: 表示任何字符出现任意次数 (可以是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 '__会';
话接上文,通过内置函数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`, '智能');
REGEXP 不支持通配符"%、_",支持正则匹配规则
-- 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