数据库:in和exists区别?

比如下面的两条语句,使用in关键字和exists关键字实现同样的功能,他们有什么区别?哪个更好一些?

select count(id) from t1 where f1 in (select f2 from t2);

select count(id) from t1 where exists (select * from t2 where f2 = t1.f1);
阅读 7.1k
3 个回答

这里 说 Oracle 中这两个的区别是:

  • in: inner 表 驱动 outter 表.
  • exists: outter 表 驱动 inner 表.
  • inner 表查询得到的结果集小的时候使用 in, 否则使用 exists.
  • 小结果集驱动大结果集时查询效率更高.

不知道楼下怎么看?

这个功能,对于@EZhang所说的,Inner表驱动Outer表,或者Outer驱动Inner表,我认为,在数据库层面上,它应该会进行SQL优化的。

关于IN和EXISTS的主要区别在于三值逻辑的判断上。EXISTS总是返回TRUE或FALSE,而对于IN,除了TRUE、FALSE值外,还有可能对NULL值返回UNKNOWN。但是在过滤器中,UNKNOWN的处理方式与FALSE相同,因此使用IN与使用EXISTS一样,SQL优化器会选择相同的执行计划。

说到了IN和EXISTS几乎是一样的,但是,就不得不说到NOT IN和NOT EXISTS,对于输入列表中包含NULL值时,NOT EXISTS和NOT IN之间的差异就表现的非常大了。输入列表包含NULL值时,IN总是返回TRUE和UNKNOWN,因此NOT IN就会得到NOT TRUE和NOT UNKNOWN,即FALSE和UNKNOWN。

mysql> select 'c' NOT IN ('a', 'b', NULL)\G;

执行一下上述代码,看看结果。你就会感到惊讶。

in 后面接一个列表,可以是直接的列表,例如 in (1,2,3,4),也可以是通过查询出来的列表,例如 in (select id from table where id < 10)

exists 后面接一个完整的查询语句,只要这个语句查询出来不为空,则该 exists 条件为 true。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题