Oracle查询中not in
和not exists
之间的区别是什么?
我何时使用not in
?并not exist
?
答案 0 :(得分:22)
NOT IN 和 NOT EXISTS 之间的差异会在结果中包含NULL
值时变得清晰。
例如:
create table test_a (col1 varchar2(30 char));
create table test_b (col1 varchar2(30 char));
insert into test_a (col1) values ('a');
insert into test_a (col1) values ('b');
insert into test_a (col1) values ('c');
insert into test_a (col1) values ('d');
insert into test_a (col1) values ('e');
insert into test_b (col1) values ('a');
insert into test_b (col1) values ('b');
insert into test_b (col1) values ('c');
insert into test_b (col1) values (null);
注意:它们的关键区别在于test_b
包含null
值。
select * from test_a where col1 not in (select col1 from test_b);
没有返回任何行
select * from test_a where
not exists
(select 1 from test_b where test_b.col1 = test_a.col1);
返回
col1
====
d
e
答案 1 :(得分:6)
我认为它有同样的目的。
not in
可以也取字面值,而not exists
需要查询来比较结果。
编辑:not exists
可能会很好用,因为它可以join
使用外部查询&如果条件使用索引的列,则可以导致使用索引。
EDIT2:请参阅this问题。
EDIT3:让我回过头来看看 请参阅this链接。我认为,这一切都取决于数据库如何翻译这个&在数据库/索引等。
答案 2 :(得分:0)
可能存在性能差异,存在速度更快。
最重要的区别是空值的处理。您的查询似乎与in和exists都相同,但是当您的子查询返回null时,您可能会感到震惊。
您可能会发现存在空值导致失败。
请参阅Joe Celko的'SQL for smarties'以更好地解释何时使用每个。
答案 3 :(得分:0)
不在测试一组元素中元素的存在,因此它更简单。
不存在可以处理更复杂的查询,包括分组(例如,具有sum(x)= z或具有count(*)> 3),具有多个条件的结果(例如,匹配多个元素),并且可以利用索引
在某些情况下,不存在比不存在更容易。我通常发现这是我在一组值中测试关键字段值的地方。
作为一个经验法则,我更喜欢不存在,因为它涵盖了很多情况而不是不存在。不存在可以用于所有不使用的情况,但不能反过来。