mysql的in关键字应⽤——传⼊集合参数快速查询
mysql面试题集合mysql IN关键字的基础⽤法c语言回文数编程
1. mysql的in关键字应该是经常使⽤的⼀个查询条件了,其作⽤是查询某个范围内的数据。
SELECT * FROM WHERE field IN (value1,value2,value3,…)
2. 当 IN 前⾯加上 NOT 运算符时,表⽰与 IN 相反的意思,即不在这些列表项内选择:
SELECT * FROM WHERE field NOT IN (value1,value2,value3,…)
3. 更多情况下,IN 列表项的值是不明确的,⽽可能是通过⼀个⼦查询得到的:
SELECT * FROM article WHERE uid IN (SELECT uid FROM user WHERE status=0)
然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在⼦查询中返回的结果必须是⼀个字段列表项。
问题
正常使⽤mysql的in关键字,我相信没有什么问题。但是在实际的场景当中,我们的需求,往往不是这样的,很多情况下,往往是传⼊⼀个集合的参数,那么我们如何能够可以快速使⽤in关键字进⾏查询呢?
例如:现在有⼀个⽤户id集合,我们想要查询在这个id集合中的⽤户信息,该如何快速实现?
解决⽅案
我们默认使⽤现在⽐较流⾏的持久化框架Mybatis
⽅案⼀:使⽤mybatis的foreach
使⽤注解的实现⽅式:
@Select("<script> "+
" SELECT * FROM user WHERE id IN "+
" <foreach collection='userId' item='item' index='index' open='(' separator=',' close=')'> "+
" #{item}"+
" </foreach>"+
"</script>"
)
List<User>queryUsersBatch(Set<Long> userId);
⽅案⼆:将集合数据转为字符串处理
⼀般情况下如果是⽤户id集合,直接输出的结果应该是:[1, 2, 3] 。我们将“ [ ”和“ ] ”去电,岂不是就可以转为1, 2, 3 ,就可以将其直接放进IN的括号⾥了。
集合去掉中括号的⽅法
可以直接使⽤Hutool的⼯具包中StrUtil的⽅法,去掉前后缀。nba强队数据
/**
* 去除两边的指定字符串
*
* @param str 被处理的字符串
* @param prefix 前缀
* @param suffix 后缀
平面设计渐变构成作业图* @return 处理后的字符串
* @since 3.1.2
*/
public static String strip(CharSequence str, CharSequence prefix, CharSequence suffix){
if(isEmpty(str)){
return str(str);
}
int from =0;
int to = str.length();
String str2 = String();
if(startWith(str2, prefix)){
from = prefix.length();
}
if(endWith(str2, suffix)){
to -= suffix.length();
}
return str2.substring(Math.min(from, to), Math.max(from, to));
}
使⽤
更改mybatis中mapper的⽅法,将集合参数换为String字符串参数:
@Select("SELECT * FROM user WHERE id IN #{userId}")
List<User>queryUsersBatch(String userId);
使⽤:
List<Long> userIdList =new ArrayList<>();
userIdList.add(25L);
userIdList.add(50L);
userIdList.add(2L);
String userIdsStr = StringUtils.String(),"[","]");
注意事项
如果在使⽤mybatis的时候,传⼊参数使⽤#的话,会在IN的括号⾥默认加上'',会导致查询数据为空,结果如下:
IN ('25, 50, 2')
出现这样的原因是,IN后边的括号⾥边的数据默认是⼀个整个的字符串⽽且这个⽅法处理,字符串中有空格。解决⽅法是使⽤$来替换#,默认不添加''即可。
手机上哪个学编程的软件好修改mapper⽅法为:
@Select("SELECT * FROM user WHERE id IN ${userId}")
List<User>queryUsersBatch(String userId);
修改后IN部分的sql:
IN (25,50,2)
这样即可完成查询。
两种⽅案对⽐
两种⽅案都可以快速在java中传⼊集合参数,然后进⾏处理,使⽤mysql的IN关键字快速查询。实现⽅式虽然不同,但是最后的sql都是⼀样的,根据个⼈喜好⾃⾏选择即可。
但是⽅案⼆处理速度应该会⽐⽅案⼀快吧,毕竟不需要遍历即可实现。
补充
关于 IN 关键字补充
1. IN 列表项不仅⽀持数字,也⽀持字符甚⾄时间⽇期类型等,并且可以将这些不同类型的数据项混合排列⽽⽆须跟 column 的类型保持
⼀致:
SELECT * FROM user WHERE id IN(1,2,'3','c')
2. ⼀个 IN 只能对⼀个字段进⾏范围⽐对,如果要指定更多字段,可以使⽤ AND 或 OR 逻辑运算符:
SELECT * FROM user WHERE id IN(1,2) OR username IN('admin','manong')
关于 IN 运算符的效率问题
如果 IN 的列表项是确定的,那么可以⽤多个 OR 来代替:
SELECT * FROM user WHERE id IN (2,3,5)css布局模型中
等效为:
SELECT * FROM user WHERE (id=2 OR id=3 OR id=5)
⼀般认为:
1. 如果是对索引字段进⾏操作,使⽤ OR 效率⾼于 IN,但对于列表项不确定的时候(如需要⼦查询得到结果),就必须使⽤ IN 运算
符。另外,对于⼦查询表数据⼩于主查询的时候,也是适⽤ IN 运算符的。
2. in或or在字段没有添加索引的情况下,所连接的字段越多(1 or 2 or 3 or 4 or…),or⽐in的查询效率低很多。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论