通常,当我想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
可能都起作用(?))。
我想知道我应该使用哪个?
让我们重写两个查询以使用更明确的逻辑:
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
两者(还有NOT ID IN (1,2,3)
)都表示完全相同的东西,并且可以在任何DBMS中使用。使用NOT ID IN (1,2,3)
可能比ID NOT IN (1,2,3)
更具性能,因为它更有可能使用ID
上的索引。