MySQL 数据库中 in 和 exists 有什么区别?

回答·46
最热
最新
  • in 关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作。 exists关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么exists的结果为true ,此时外层的查询语句将进行查询;如果子查询没有返回任何行,那么exists的结果为false,此时外层语句将不进行查询。 外层查询表小于子查询表,则用exists,外层查询表大于子查询表,则用in,如果外层和子查询表差不多,则爱用哪个用哪个。注意你用的SQL语句吧,Table A跟Table B长度做对比,A.length 跟 B.length 如果差不多一样大小,in 跟 exists效果差不多。
  • 1、exists 表示子查询是否存在,如果存在则为 true,不存在为 false. 不返回任何结果 in 查询子条件返回必须只有一个字段,只会执行一次,会把符合条件的记录全部查出来 2、A,B 两张表,查询 A 是否在 B 表中存在,如果 A 表大,B 表小,则使用 in。如果 B 表大,A 表小,则使用 exists 3、从性能上看,如果两张表一样大,In 和 exists 效率差不多,可任你选一个使用。
  • 从数据库的执行维度来说, in 会检索表里的全部数据,exists 当检索到时则返回。 从数据分布的维度, 如果只有一条且为第一条 2者效率相当,后面的情况就可以 依据最优和最差 平均 来做判断了。 从使用范围的维度 in 可以拿到具体数据 可以做存在判断 ,exists 只能做判断。
  • in 检索全表判断字段,最终显示符合主表与括号里字段相对应字段的查询结果; 而 exists,则是返回结果为 boolean 值,当有等于 true,则停止检索; 如果数据较多,判断条件复杂,exists 效率高; 不过数据较少,判断条件少,in 使用简单,更加直观,推荐 in;
  • 这个区别也太大了吧,二者完全没有难以区分的点。提问者仍需继续努力~
  • in 和 exists 都是 where 子句用来过滤结果集的查询方式。in 适合子句数据量比较小的查询方式。exists 适合子句数据量比较大的查询方式。如果你用这个问题问面试者时其实是反映不出来他对两个查询子句的掌握情况。个人喜欢用这两个语句性能来问。如果可以的回答正确的代表他对这两个语句以及对查询理解的内容上比较透彻了。
  • 1.exists 判断是否存在,返回 true 或者 false,某些情况下可以灵活的在 exists 的子查询上建立合理的索引,查询效率会有较大提高。 2.in 先执行子查询,也就是 in()所包含的语句。子查询查询出数据以后,遍历主表满足条件的行,将前面的查询分为 n 次普通查询(n 表示在子查询中返回的数据行数) 3.尽量使用 小表驱动大表。 4.in 适合于外表大而内表小的情况。 5.exists 适合于外表小而内表大的情况。
  • 例如有两张表 A 和 B,有如下两条 sql select *from a where bid in  (select  id  from  b ) select  * from  a where bid exists (select id from b  where  a.bid=b.id) 对于 in 查询,是先查询出 b 表数据再去遍历匹配和 a 表相同的数据 对于 exists 查询,是先查询出 a 表数据,遍历匹配和 b 表相同的数据 这两者首先是执行计划的不同,另外在查询时有条规则,就是小的结果集去驱动大的结果集,这样可以减少磁盘 io 的次数提高查询效率 所以当 b 表数据<a 表时,用 in 查询 b 表数据>a 表时,用 exists 当然如果两表数据量差别不大,执行效率上是没多少差异的
  • in 和 exists 的差异还是挺大的 从语义上来说 in 是去匹配 in 后的结果集 exists 是条件上的二次匹配,匹配和结果集内相同的数据 二者实现的效果可能差异不大但是内部的实现差很多 in 是有数量上限的,而 exists 没有。 in 是由 in 后面的数据先运行得出结果集后再去匹配 exists 是先运行外面的结果,再去和 exists 内的数据做匹配 所以,为了效率,in 内部的数据要少一些,exists 要外部数据少一些更能提升效率
  • exists 关注子查询结果集是否为空 in 先查询子查询记录,按结果个数查询主查询。 区别,exists 可以在子查询有多个字段没有限制,in 返回结果必须一个字段。性能上除了考虑内外表的大小,同时需要考虑索引的因素。子查询加了索引会走索引,exists 会更耗时