• home > DB > mysql >

    msyql关键词搜索实现-MySql MySQL模糊匹配查询like、regexp、in

    Author:zhoulujun Date:

    MySQL模糊匹配查询like、regexp、in,SQL模式(% ,_),正则模式 熟悉正则表达式即可。in后面可以是多个值。LIke CONCAT(str1,str2,…) 函数返回结果为连接参数产生的字符串。

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

    SQL LIKE模糊查询

    SQL的模式匹配允许你使用

    • “_”匹配任何单个字符,

    • “%”匹配任意数目字符(包括零个字符)。

    在 MySQL中,SQL的模式缺省是忽略大小写的。

    SELECT 字段 FROM 表 WHERE 某字段 Like 条件

    %:表示任意个或多个字符。

    可匹配任意类型和长度的字符。比如

     SELECT * FROM user WHERE name LIKE ‘%三%’

    将会把name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

    如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

    SELECT * FROM user WHERE name LIKE ‘%三%’ AND name LIKE ‘%猫%’

    若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’

    虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

    _:表示任意单个字符。

    匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符),比如:

    SELECT * FROM user WHERE name LIKE ‘_三_’

    只找出“唐三藏”这样name为三个字且中间一个字是“三”的;

    再比如 SELECT * FROM user WHERE u name LIKE ‘三__’;

    只找出“三脚猫”这样name为三个字且第一个字是“三”的;

    like操作符后不跟通用匹配符(%或_)

    如果在使用like操作符时,后面没有使用通用匹配符(%或_),那么效果是和“=”一致的

    在SQL执行优化时查询优化器将 like 默认为 “=”执行

    SELECT * FROM movies WHERE movie_name like '唐伯虎';

    只能匹配movie_name=“唐伯虎”的结果,而不能匹配像“唐伯虎点秋香”或“唐伯虎点香烟”这样的结果.

    谨慎使用SQL通配符

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

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

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

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




    SQL 正则模式

    由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)

    SELECT * FROM user WHERE name name REGEXP ‘^三’

    关于正则表达式,更多查看:https://www.zhoulujun.cn/html/theory/algorithm/IntroductionAlgorithms/

    一般熟悉此篇文章内容即可:《深入正则表达式(2):元字符/关键子/符号说明 



    SQL IN查询

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

    select * from user where name in("唐三","唐三藏");

    in查询不支持模糊查询

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

    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内置函数检索(locate,position,instr)

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

     LOCATE(substr, str, [pos])函数

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

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

    用LOCATE关键字进行模糊匹配,等同于:"like '%网%'"

    SELECT * from app_info where LOCATE('网', `appName`) > 0;


    POSITION(substr IN substr)方法

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

    用POSITION关键字进行模糊匹配,等同于:"like '%网%'" 

    SELECT * from app_info where POSITION( '网' IN `appName`);


    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;


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

    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;



    参考文章:

    https://blog.csdn.net/qq_39390545/article/details/106414765  MySQL模糊查询用法大全(正则、通配符、内置函数等)

    MySQL模糊匹配查询like、regexp、in https://www.cnblogs.com/javahr/p/9780650.html



    转载本站文章《msyql关键词搜索实现-MySql MySQL模糊匹配查询like、regexp、in》,
    请注明出处:https://www.zhoulujun.cn/html/DB/mysql/2022_0515_8816.html