首页 存档 技术 查看内容

在SQLServer中为什么不建议使用NotIn子查询

2018-3-30 13:00 |来自: 互联网 499 0

摘要: (点击上方蓝字,快速关注我们) 作者:宋剑 网址:http://www.cnblogs.com/CareySon/p/4955123.html 在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In ...

(点击上方蓝字,快速关注我们)


作者:宋剑

网址:http://www.cnblogs.com/CareySon/p/4955123.html


在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题:

  • 结果不准确

  • 查询性能低下


下面我们来看一下为什么尽量不使用Not In子句。


结果不准确问题

在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此任何与Null值进行比对的二元操作符结果一定为Null,包括Null值本身。而在SQL Server中,Null值的含义转换为Bool类型的结果为False。让我们来看一个简单的例子,如图1所示。

图1.Null值与任何值进行对比结果都为Null

SQL Server提供了“IS”操作符与Null值做对比,用于衡量某个值是否为Null。

那么Not In 的问题在哪呢,如图2所示。

图2.Not In产生不准确的值

在图2中,条件3不属于Not In后面列表的任意一个,该查询却不返回任何值,与预期的结果不同,那么具体原因就是Not In子句对于Null值的处理,在SQL Server中,图2中所示的Not In子句其实可以等价转换为如图3所示的查询。

图3.对于Not In子句来说,可以进行等价转换

在图3中可以看到Not In可以转换为条件对于每个值进行不等比对,并用逻辑与连接起来,而前面提到过Null值与任意其他值做比较时,结果永远为Null,在Where条件中也就是False,因此3

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部