为什么<>'null'在MySQL中有效?

时间:2018-12-19 13:00:02

标签: mysql sql comparison

希望这个问题不太笼统。在网站上或SQL文档中找不到任何内容:

在编码时,我对此进行了测试,但令我惊讶的是:

SELECT * FROM cal_entry WHERE cal_entry.parent_id <> 'null'

它实际上显示的行中没有带有NULL值的行(数据库中是真实的NULL值,而不是内部带有'null'的字符串)。

根据文档,我当然应该使用NOT NULL。顺便说一下,它不能与= 'null'一起使用,就像文档中正确说明的那样。

有人可以解释吗?

4 个答案:

答案 0 :(得分:2)

您正在选择<> 'null'为真的所有行。

比较(等于或不等于)null为null,因此,如果cal_entry.parent_id为null的行,则条件将为false / null。

因此,您的查询将获取所有不为null或不包含字符串'null'的行。

(注意,您也可以写<>'something_else'

答案 1 :(得分:1)

此运算符给您的结果不等于。例如$ var!=空。 我们在mysql中写为<>。这是一种验证,该值应永远不等于null。

答案 2 :(得分:1)

假设parent_id列中的int,查询将返回所有非空,非零的行:

SELECT *
FROM (
    SELECT NULL AS parent_id UNION ALL
    SELECT 0 UNION ALL
    SELECT 1 UNION ALL
    SELECT 2
) AS cal_entry
WHERE cal_entry.parent_id <> 'null'
-- returns 1 and 2 but not 0!

在将数字与字符串进行比较时,MySQL会将字符串转换为数字。一些例子:

  • 'null'变为0
  • 'asdf'变为0
  • '1asdf'成为123
  • '1'变为1

您的查询的行为如下:

WHERE cal_entry.parent_id <> 0

答案 3 :(得分:0)

使用null时,应始终注意以下两个语句-

  1. 表达式可以为null,但永远不能等于null。
  2. 两个null永远不会相等。

因此,在您的查询中,只要有比较null<>null,它的第二条语句就会返回true。

此外,请始终考虑某些行可能包含null的可能性-

Select * from cal_entry where cal_entry.parent_id!=10

此查询将省略具有空条目的行。而是使用-

Select * from cal_entry where cal_entry.parent_id!=10 or cal_entry.parent_id is null