SQL编程思想:基于5种主流数据库代码实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


5.2 空值的比较

在SQL语句中,任何数据与空值进行算术比较的结果既非真也非假,而是未知的。因为任何数据和未知数据比较的结果都未知,例如:

以上运算的结果均未知,空值和数字0不同,空值和空字符串('')也不相同,空值等于空值的运算结果未知,空值不等于空值的运算结果也未知。

由于空值不能使用比较运算符进行判断,SQL引入了判断数据是否为空的IS NULL和IS NOT NULL运算符。我们在第2章中已经介绍了空值判断条件,这里不再重复讲述。在此介绍两个专有的运算符,它们可以用于空值的比较。

第一个是MySQL中的<=>运算符,它可以用于等值比较,也支持空值的比较,例如:

查询返回的结果如下:

MySQL使用数字1表示True,使用数字0表示False。

第二个运算符是PostgreSQL中的IS [NOT] DISTINCT FROM,它可以用于等值比较,也支持空值的比较,例如:

查询返回的结果如下:

另外,还有一个需要注意的运算符就是NOT IN。我们知道IN运算符用于查询属于指定列表中的数据,NOT IN运算符用于查询不属于指定列表中的数据,例如:

查询返回的结果如下:

IN运算符使用等值(=)比较运算符判断数据是否和列表中的某个数据相等,因此该查询等价于以下语句:

OR运算符只要两边有一个结果为真,最终的结果就为真,所以列表中的NULL对查询不会产生实际的影响。但是,如果将以上查询改为使用NOT IN运算符:

若不小心,我们可能以为该查询会返回除1、2、3外的其他员工编号,但该查询实际不会返回任何数据。为什么呢?我们将查询改写一下,就很清楚了:

问题就在于查询条件中的emp_id!=NULL,它的结果是未知的,也就意味着没有任何数据满足查询条件,也就不会返回任何结果。

注意:在查询条件中使用NOT IN运算符时,一定要小心列表中可能出现的空值。