exist和in
exist适合 子查询中表数据大于外查询表中数据的业务场景
in:适合外部表数据大于子查询的表数据的业务场景
- in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
- in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的
两者在sql中执行的差别:
- exist: 先执行外部查询语句,然后在执行子查询,子查询中它每次都会去执行数据库的查询,执行次数等于外查询的数据数量。查询数据库比较频繁(记住这点),如果b表再id上加了索引也会走索引
- in: 先查询 in()子查询的数据(1次),并且将数据放进内存里(不需要多次查询),然后外部查询的表再根据查询的结果进行查询过 滤,最后返回结果
ANY关键字
假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,select ...from ... where a > any(...);
->
select ...from ... where a > result1 or a > result2 or a > result3;
ALL关键字
ALL关键字与any关键字类似,只不过上面的or改成and。即:select ...from ... where a > all(...);
->
select ...from ... where a > result1 and a > result2 and a > result3;
SOME关键字
some关键字和any关键字是一样的功能。所以:select ...from ... where a > some(...);
->
select ...from ... where a > result1 or a > result2 or a > result3;