当前位置:Gxlcms > 数据库问题 > MYSQL中in的用法

MYSQL中in的用法

时间:2021-07-01 10:21:17 帮助过:3人阅读

   以如下SQL为例,分析in在嵌套查询语句中的工作原理:
  1. <span style="font-family: 宋体; font-size: 16px;"><span style="color: #0000ff;">SELECT</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">FROM</span> A <span style="color: #0000ff;">WHERE</span> id <span style="color: #808080;">IN</span> (<span style="color: #0000ff;">SELECT</span> id <span style="color: #0000ff;">FROM</span> B);)</span>
   等价于:
  • SELECT id FROM B ----->先执行in中的查询,并且缓存结果集;
  • SELECT * FROM A WHERE A.id = B.id。
   工作原理:缓存B中查询出来的id,A表查询时把A表的id与缓存数据比较,满足条件的数据加入结果集。    以上SQL语句中,in中的子查询语句仅仅执行一次,它查询出B中的所有的id并缓存起来,然后检查A表中的id在缓存中是否存在,如果存在则将A的当前记录加入到结果集中,直到遍历完A表中所有记录为止。  

适用场景

  从内外表数据量的大小视角剖析,B表数据比A表数据小,B表符合要求的数据都被缓存起来,A中每查询一次就与缓存中的数据比较一次。以下用遍历结果集的方式来分析IN查询:
  1. <span style="font-family: 宋体; font-size: 16px;"> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> search() {
  2. List result </span>= <span style="color: #0000ff;">new</span> ArrayList(); <span style="color: #008000;">//</span><span style="color: #008000;">结果集</span>
  3. String A[] = {"select * from A"}; <span style="color: #008000;">//</span><span style="color: #008000;"> 存储从A表查询到的结果集</span>
  4. String B[] = {"select * from B"}; <span style="color: #008000;">//</span><span style="color: #008000;"> 存储从B表查询到的结果集</span>
  5. <span style="color: #0000ff;">for</span><span style="color: #000000;"> (String bValue : B) {
  6. </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (String aValue : A) {
  7. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (aValue.equals(bValue)) {
  8. result.add(aValue);
  9. </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
  10. }
  11. }
  12. }
  13. System.out.println(result);
  14. }</span></span>

   通过以上Java伪代码可以看出,当B表的数据较大时不适合使用in查询,因为它会遍历B表中的全部记录。

案例分析

   1、A表中有100条记录,B表中有1000条记录,那么最多可能遍历1000*100次,效率很差;    2、A表中有1000条记录,B表中有100条记录,那么最多可遍历100*1000此,内循环次数减少,效率大大提升。

小结

   IN查询适合B表数据量比A表数据量小的情况,并且是从缓存中取数据。

MYSQL中in的用法

标签:search   pre   数据   循环   class   mysql   col   array   break   

人气教程排行