为什么使用<>进行SQL比较时,不会返回具有NULL值的行
为什么SQL中使用<>运算符与NULL值不返回结果行?
在SQL中,使用<>运算符进行比较时,如果其中一个操作数是NULL值,将不会返回结果行。这是因为在三态逻辑中,使用<>运算符与NULL值进行比较时,返回的结果是未知的。在谓词中,未知的结果被视为假。
要解决这个问题,可以使用IS NOT NULL运算符来检查NULL值。IS NOT NULL运算符可以用于检查列中是否存在非NULL值,如果存在非NULL值,则返回结果行。下面是一个示例:
SELECT column_name FROM table_name WHERE column_name IS NOT NULL;
使用IS NOT NULL运算符可以确保返回所有不包含NULL值的结果行。
总之,SQL中使用<>运算符与NULL值不返回结果行的原因是,NULL与任何值进行比较的结果是未知的。为了解决这个问题,可以使用IS NOT NULL运算符来检查NULL值,以确保返回所有不包含NULL值的结果行。
在SQL中,使用比较运算符<>(不等于)进行比较时,如果操作数中出现NULL值,根据ANSI-92 SQL标准的规定,比较的结果将会是"UNKNOWN",而不是true或false。
为了更好地理解SQL中的NULL值的工作原理,可以参考《4 Simple Rules for Handling SQL NULLs》(链接:http://halturin.blogspot.ca/2010/07/four-rules-for-nulls.html)。
为了验证上述规则,我们可以通过SQL Fiddle(链接:http://sqlfiddle.com/#!3/ea7d2/1)进行实验。
首先,在MS SQL Server 2008中创建一个名为X的表,包含两列:A(整数类型)和B(字符类型)。
CREATE TABLE X ([A] int, [B] varchar(3)) ; INSERT INTO X ([A], [B]) VALUES (2, 'pqr'), (3, 'xyz'), (NULL, 'abc') ;
接下来,使用以下查询语句来检索表X中的数据,其中包含A为NULL或A不等于2的行:
SELECT * FROM X WHERE A IS NULL OR A <> 2
查询结果如下:
| A | B | |--------|-----| | 3 | xyz | | (null) | abc |
从结果可以看出,查询结果中包含A为NULL的行,这是因为在比较运算符<>中,NULL值不等于任何值,所以满足查询条件。
因此,当使用SQL中的比较运算符<>进行比较时,要注意处理NULL值,可以使用IS NULL或IS NOT NULL来明确处理NULL值的情况,以避免出现不符合预期的结果。
为什么使用<>运算符在SQL中无法返回包含NULL值的行?
在SQL中,NULL值不会通过=或<>运算符进行比较。相反,需要使用IS NULL或IS NOT NULL进行比较。这是因为NULL表示缺失或未知的值,它与其他值不同。
当使用<>运算符进行比较时,它会将NULL值视为未知的,因此不会返回包含NULL值的行。这是因为NULL的特性决定了在比较时无法确定其与其他值的关系。
解决这个问题的方法是使用IS NULL或IS NOT NULL运算符来比较包含NULL值的行。这将明确地指定NULL值的比较方式,使得可以正确地返回包含NULL值的行。
总结起来,使用<>运算符在SQL中无法返回包含NULL值的行是因为NULL值的特殊性质使得它无法与其他值进行比较。解决这个问题的方法是使用IS NULL或IS NOT NULL运算符来明确指定对NULL值的比较方式。
参考链接:[NULL COMPARISON](http://technet.microsoft.com/en-us/library/ms191270%28v=sql.105%29.aspx)