1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql中in和exists区别

mysql中in和exists区别

时间:2020-02-25 00:40:32

相关推荐

mysql中in和exists区别

目录

`in` 和 `exists``in``exists`概述举例`in` 和 `exists` 用法区别小结

inexists

mysql的多表查询中,始终要遵循的一个原则:小表驱动大表

in

in关键字进行子查询时,内层查询语句只能返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作

SELECT * FROM A WHERE id IN (SELECT id FROM B);

如上述sql语句,它的执行流程

先执行in中的查询,即SELECT id FROM B其次在执行SELECT * FROM A WHERE A.id = B.id

假设SELECT id FROM B查询出有m条记录,然后检查A表中查询出的idm条记录中是否存在,如果存在则将A的查询数据加入到结果集中,直到遍历完A表中所有的结果集为止

B表数据量很大的时候不适合用in,因为它有可能最多会将B表数据全部扫描一次如果A表有1000条记录,B表有10000条记录,那么最多有可能扫描10000 * 1000次表,效率很差如果A表有1000条记录,B表有100条记录,那么最多有可能扫描100 * 1000次,扫描表次数大大减少,效率大大提升

总结:当外层查询表数据量大于子查询表时,则用in,此时也正是遵循了小表驱动大表的原则

exists

概述

exists关键字后面的参数是一个任意的子查询sql对子查询进行运算以判断它是否返回行

如果至少返回一行,那么exists的结果为true,此时外层的查询语句将进行查询如果子查询没有返回任何行,那么exists的结果为false,此时外层语句将不进行查询注意:当我们的子查询为SELECT NULL时,mysql仍然认为它是true

exists对外表用loop逐条查询,每次查询都会查看exists的子查询语句,当exists里的子查询语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录;反之,如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃

举例

select * from user where exists (select 1);

user表的记录逐条取出,由于子条件中的select 1永远能返回记录行,那么user表的所有记录都将被加入结果集,所以与select * from user是一样的

select * from A where exists (select * from B where user_id = 0);

可以知道对A表进行loop时,检查条件语句select * from B where user_id = 0由于user_id永远不为0,所以条件语句永远返回空集,条件永远为false,那么A表的所有记录都将被丢弃

总结:如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断nexists条件

inexists用法区别

in查询的子查询返回结果必须只有一个字段,例如

select * from user where user_id in (select id from B);

不能是

select * from user where user_id in (select id, age from B);

exists就没有这个限制,可以是任意的子查询

小结

in查询在内部表和外部表上都可以使用到索引exists查询仅在内部表上可以使用到索引当子查询结果集很大,而外部表较小的时候,existsBlock嵌套循环的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于in当子查询结果集较小,而外部表很大的时候,existsBlock嵌套循环优化效果不明显,in的外表索引优势占主要作用,此时in的查询效率会优于exists表的规模不是看内部表和外部表,而是外部表和子查询结果集

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。