比如下面的两条语句,使用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);
比如下面的两条语句,使用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);
这个功能,对于@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。
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
3 回答2.3k 阅读
这里 说 Oracle 中这两个的区别是:
不知道楼下怎么看?