<>或NOT IN,为什么查询返回错误的结果

时间:2015-11-27 07:57:03

标签: mysql

我想知道这两个查询之间的语法更好:

SELECT MyField1
FROM MyTable
WHERE MyField2 <> 0 AND MyField2  <> 10

或:

SELECT MyField1
FROM MyTable
WHERE MyField2 NOT IN (0, 10)

修改

相关问题:为什么我使用NOT IN (NULL, 0, 10)我没有获得任何行?

3 个答案:

答案 0 :(得分:1)

一般情况下尽量不要使用NOT IN。这是我做了一段Don't Use Not In的写作。 不要使用除非你真的知道你的数据,否则你真的知道NOT IN变成丑陋。

在你非常狭隘的问题中,如果你不是专家,那么肯定,NOT IN是可行的方法。

问题通常不是(0,10),如op问题。这应该是我经常达到的我的武器库。而不是IN对我来说不是其中之一。使用null值非常危险,并且由于人们通常不知道他们的数据,使用该子句可能会浪费宝贵的时间。

有一天,我会偶然发现一个伟大的博客,有人写了这篇博客,描述了他和两个同事,所有非懒散的人,花了相当多的时间来研究他们的NOT IN查询失败的原因。

答案 1 :(得分:1)

使用MyField2 NOT IN (0, 10)表现良好(优化者将能够找出最佳方法)并表达最佳意图(人类易于理解)。

为什么MyField2 NOT IN (0, 10, NULL)不起作用?

在SQL中,与NULL的任何平等比较都会产生NULL,即x = NULL会产生NULL,这既不是true也不是false }。由于NOT IN (...)需要与列表中的每个值进行比较,因此得到的(布尔)比较结果列表将包含NULL。在确定所有比较是false(即AND所有布尔值)时,结果为NULL,而不是true,因此测试失败,无论什么正在测试价值。

答案 2 :(得分:0)

语义上两者都是平等的。潜在的性能差异应该是查询优化器的问题。所以这一切归结为哪个变体更能说明你的意图。