一:搜索字段包含某个字符串
方法1:like
SELECT * FROM 表名 WHERE 字段名 like "%字符%";
方法2:find_in_set()
利用mysql 字符串函数 find_in_set();
SELECT * FROM users WHERE find_in_set('字符', 字段名);
这样是可以的,怎么理解呢?
mysql有很多字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以","分割开。
注:当str2为NO1:“1,2,11,12,33,44”,NO2:“15,16,19”时,判断两个数据中str2字段是否包含‘2’,该函数可完美解决
mysql > SELECT find_in_set()('2','1,2,11,12,33,44') as test;
-> 1
mysql > SELECT find_in_set()('2','15,16,19') as test;
-> 0
find_in_set()和like的区别:
主要的区别就是like是广泛的模糊查询,而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开。
现在想查询拥有角色编号为2的用户,用like关键字查询:
SELECT userid,username,userrole 角色 FROM `user` WHERE find_in_set('2',userrole)
结果:
用 find_in_set() 查询:
结果:
显然用 find_in_set() 查询得到的结果才是我们想要的结果。所以他俩的
主要的区别就是like是广泛的模糊查询;而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开,Find_IN_SET查询的结果要小于like查询的结果。
mysql 中find_in_set()和in()用法比较
在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型。
find_in_set 函数使用方法
举个例子来说:
有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文...1,12,13 等等 。
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4 的格式存储。
那我们如何用sql查找所有type中有4图文标准的文章呢??
这就要我们的 find_in_set 出马的时候到了。
方法三:locate(字符,字段名)
使用locate(字符,字段名) 函数,如果包含,返回>0的数,否则返回0 ,
它的别名是 position in
select * from 表名 where locate(字符,字段)
select * from 表名 where position(字符 in 字段);
例子:判断site表中的url是否包含'http://'子串,如果不包含则拼接在url字符串开头
update site set url =concat('http://',url) where locate('http://',url)=0
注意mysql中字符串的拼接不能使用加号+,用concat函数
方法四:INSTR(字段,字符)
select * from 表名 where INSTR(字段,字符)
二:搜索字段包含多个字符串
或许只有正则才能满足条件
mysql正则表达式网上一大堆,这边就不做过多的解释
举个例子来说:
我们要查询用户填写的地址字段,是否包含关键字(区,城,店,学,镇,路,街,村,栋,号,院,门,组,楼,府,庄,厂,室,铺,馆,苑,园,期,场,乡,公寓,小区,单元,公司,超市),不包含的话,我们可以初步判断为恶意地址
select * from 表名 where post_address NOT REGEXP '/区|城|店|学|镇|路|街|村|栋|号|院|门|组|楼|府|庄|厂|室|铺|馆|苑|园|期|场|乡|公寓|小区|单元|公司|超市/'
参考资料:
www.cnblogs.com/ericli-eric…
www.jb51.net/article/143…