MySQL - 关于null的=“”和!=“”的不同行为

时间:2014-04-09 16:02:47

标签: mysql sql null string

这可能是一个愚蠢的问题,但是null似乎既不等于也不等于任何空字符串""。

我有一个包含以下值的表:

id field1 field2 field3
1   a        b     c
2   null     b     c
3            b     c
4   a        b     c

我的查询

select * from table where field1 = ""

不返回第2行,其中field1的值为null。这是绝对有意义的,因为null不等于空字符串。

但是,

select * from table where field1 != "" 

也不会返回第2行。

有没有人对此的历史渊源有解释?是因为值null意味着我们不知道该值,因此不知道field1是否等于或不等于第2行的空字符串?

4 个答案:

答案 0 :(得分:7)

NULL不等于空。 NULL不等于任何,包括NULL。要与NULL进行比较,您需要使用IS NULLIS NOT NULL

SELECT NULL = NULL,
NULL != NULL,
NULL IS NULL,
NULL IS NOT NULL

NULL = NULL     NULL != NULL        NULL IS NULL    NULL IS NOT NULL
(null)             (null)            1                  0

SQL Fiddle

select * from table where field1 IS NULL

select * from table where field1 IS NOT NULL

答案 1 :(得分:2)

  

是否因为值null意味着我们不知道值和   因此,不知道field1是等于还是等于空   第2行的字符串?

你是对的。每当您对NULL进行比较时,结果为NULL

您可以将NULL视为“未知”。当NULL存储在记录的列中时,并不意味着它没有值,这意味着它尚未输入数据库。

例如,您可能有一个“人员”记录,其中包含“出生日期”列。如果值为NULL,则并不意味着该人未出生。它只是意味着它还没有输入,因此,根据数据库,该人的出生日期是“未知”。

如果您不知道该人的出生日期,则无法回答以下任何一个问题:

  

4月1日出生的人是谁?

     

这个人不是4月1日出生的吗?

两者的答案都是“未知”。

你也无法回答:

  

4月1日之后出生的人是谁?

     

这个人不是在4月1日之前出生的吗?

每当您将已知值与“未知”进行比较时,答案将是“未知”。

此外,如果两个人的出生日期都是NULL或“未知”,您也无法回答这些问题:

  

这两个人是在同一天出生的吗?

     

这两个人不是在同一天出生的吗?

     

是第二个人之后出生的人吗?

     

第二个人出生的人是谁吗?

每当您将“未知”值与另一个“未知”值进行比较时,答案就是“未知”。

将任何内容与“未知”值进行比较会产生“未知”。

但是,您始终可以回答以下问题:

  

我知道这个人的出生日期吗?

     

我不知道这个人的出生日期吗?

要在MySQL中提出该问题,请使用IS NOT NULLIS NULL

答案 2 :(得分:0)

特殊NULL值既不匹配(通过=运算符)任何实际值,也不匹配(通过<>运算符)该值。事实上,它甚至不匹配或不匹配。因此,要获取包含特定字段为NULL的行的结果集,请执行以下操作:

SELECT * 
FROM table 
WHERE field1 is NULL

或获取特定字段不是NULL的行:

SELECT * 
FROM table 
WHERE field1 is NOT NULL

在更复杂的查询中,您可能希望查找某个字段与特定值不匹配的所有行,但也要包含字段为NULL的那些行。您可以按如下方式执行此操作:

SELECT *
FROM table
WHERE field1<>5 OR field1 IS NULL

NULL进行单独测试的测试要点是确保不可用或不适用的值与存在的值不匹配或不匹配。这里的理由是,由于我们不知道价值是什么,如果它存在,我们无法明确地说它是否匹配。

答案 3 :(得分:0)

"" != null

正如问题中所述,您的数据库中有null值,但是,您再次检查空字符串,实际上不是null

在mysql中,使用

完成空比较
IS NULL

例如:

SELECT * FROM table WHERE field1 IS NULL;

SELECT * FROM table WHERE field1 IS NOT NULL;