在SQL中不是“ column` IN(…)vs``column` NOT IN(...)

问题描述 投票:0回答:2

通常,当我想Select all of records when column 'ID' NOT have any value in (1,2,3)时,我将使用这样的查询:

SELECT * FROM tableA WHERE ID NOT IN (1,2,3)

但是今天,我尝试使用这样的不同查询:

SELECT * FROM tableA WHERE NOT (ID IN (1,2,3))

而且令人惊讶的是,它对我有效! SQL Server和Oracle数据库(其他sql可能都起作用(?))。

我想知道我应该使用哪个?

sql sql-server
2个回答
1
投票

让我们重写两个查询以使用更明确的逻辑:

SELECT * FROM tableA WHERE ID NOT IN (1,2,3)
SELECT * FROM tableA WHERE ID <> 1 AND ID <> 2 AND ID <> 3;

第二个查询:

SELECT * FROM tableA WHERE NOT (ID IN (1,2,3))
SELECT * FROM tableA WHERE NOT (ID = 1 OR ID = 2 OR ID = 3)

根据迪摩根定律,以上变为:

SELECT * FROM tableA WHERE ID <> 1 AND ID <> 2 AND ID <> 3;

所以,您的两个版本在逻辑上实际上是等效的。

只是对摩根大通法律的重温:

NOT (p AND q) == NOT p OR NOT q
NOT (p OR q)  == NOT p AND NOT q

0
投票

两者(还有NOT ID IN (1,2,3))都表示完全相同的东西,并且可以在任何DBMS中使用。使用NOT ID IN (1,2,3)可能比ID NOT IN (1,2,3)更具性能,因为它更有可能使用ID上的索引。

© www.soinside.com 2019 - 2024. All rights reserved.