您的位置:首页 > 数据库 > SQL语言

SQL中not in有Null值时

更多 2016/6/20 来源:SQL语句学习浏览量:1479
学习标签: SQL
本文导读:在写SQL语句时,经常需要查询不在某个表、不等于某些值的记录,SQL Server中提供了not in来实现这个功能,但是,如果not in 后面的值有NULL值时,就会返回错误的结果,即没有任何结果返回,所以SQL中在使用not in时需要特别留意。下面通过实例说明

一、实例数据

 

Table_A表和Table_B表

 

 
SQL 代码   复制

CREATE TABLE [dbo].[Table_A](
 [ID] [nchar](10) NULL,
 [Name] [nchar](10) NULL
) ON [PRIMARY]

GO

ID         Name
001        张三        
002        李四        
003        王五              

 

CREATE TABLE [dbo].[Table_B](
 [ID] [nchar](10) NULL,
 [Name] [nchar](10) NULL
) ON [PRIMARY]

GO

ID       Name
NULL     张三        
002      李四        
NULL     王五 

 

二、查询出在Table_A表中不在Table_B表中的记录

 

1、错误SQL写法 (没有任何结果返回)

 

 
SQL 代码   复制

SELECT  *
FROM    dbo.Table_A AS a
WHERE   a.ID NOT IN ( SELECT    b.ID
                      FROM      dbo.Table_B AS b)

 

2、错误原因

(1)、如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)

(2)、如果null参与比较运算,则结果可视为false。(例如:>=,<=,<>  大于,小于,不等于)

(3)、如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。

(4)、如果在not in子查询中有null值的时候,则不会返回数据。

例如

 

 
SQL 代码   复制

SELECT *
FROM dbo.TableA AS a
WHERE a.id NOT IN ( 2, NULL )


--等同于:

SELECT *
FROM Table_A AS a
WHERE a.id <> 2
 AND a.ID <> NULL

--由于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。

 

3、正确SQL写法

 

 
SQL 代码   复制

--写法1                      
SELECT  *
FROM    dbo.Table_A AS a
WHERE   a.ID NOT IN ( SELECT    b.ID
                      FROM      dbo.Table_B AS b
                      WHERE     b.ID IS NOT NULL ) --排除NULL值参与运算符比较


--写法2                                                        
SELECT  *
FROM    dbo.Table_A AS a
WHERE   NOT EXISTS ( SELECT *
                     FROM   dbo.Table_B AS b
                     WHERE  a.ID = b.ID )

 

收藏
285
很赞
266