sql中exists和in的区别是什么?为什么使用in的时候,大表和小表的顺序不同,执行时间也会不同啊?
可以参考这里
你想象一下,如果你手里有两张纸制表格,让你自己用肉眼来过滤数据,会如何执行in以及exists?
- 如果是in 的情况,你需要把第二张纸里的数据全部看完,并且把关键字段去重,然后再拿着第一张纸用这个去重的关键字段过滤,如果第二张纸里只有两条记录,你肯定可以记住,然后看第一张纸的时候能够迅速的判断哪行需要哪行不需要。
- 如果是exists的情况,你是直接看第一张纸,从第一行开始看起,每行都去对照下第二张纸,只要在第二张纸里找到任意一行能匹配上,你就可以确定这行需要保留,继续找第一张纸的下一行,假设你第一张纸总共才3行,只要随便扫3眼第二张纸就能得到结果了,实际上根本不需要把第二张纸全部看一遍,但你第一张纸需要每行都去对应扫一次第二张纸,如果第一张纸数据太多,这种方式也会很耗时间。
好在,现在很多数据库已经认知到这种差异了,有的数据库已经在新版本中对in 和exists的执行计划进行了调优,自动去判断更适合使用哪种方式(虽然不是绝对判断准确)
exist比in更加好用
可看看电子书 sql进阶
里面讲解了exist的作用
只不过我们更多的人更喜欢用in
很少用exist