“不在”和“不存在”之间有什么区别?

时间:2009-11-09 06:46:55

标签: sql database oracle

Oracle查询中not innot exists之间的区别是什么?

我何时使用not in?并not exist

4 个答案:

答案 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),具有多个条件的结果(例如,匹配多个元素),并且可以利用索引

在某些情况下,不存在比不存在更容易。我通常发现这是我在一组值中测试关键字段值的地方。

作为一个经验法则,我更喜欢不存在,因为它涵盖了很多情况而不是不存在。不存在可以用于所有不使用的情况,但不能反过来。