null有哪些常见的意思?(如何正确理解 SQL 中的 NULL)

SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL或者这样写:
复制代码
WHERE SOME_COLUMN = 1正确的写法应该是第二种(WHERE SOME_COLUMN IS NULL) 。
为什么要这样写?
在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?
例如,如果我们想要知道一个列的值是否等于 1,WHERE 语句是这样的:
复制代码
WHERE SOME_COLUMN = 1那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理 NULL?
因为,在 SQL 中,NULL 表示“未知” 。也就是说,NULL 值表示的是“未知”的值 。
NULL 等于未知在大多数数据库中,NULl 和空字符串是有区别的 。
但并不是所有数据库都这样,例如,Oracle 就不支持空字符串,它会把空字符串自动转成 NULL 值 。
在其他大多数数据库里,NULL 值和字符串的处理方式是不一样的:

  • 空字符串表示“没有值”,这个值是已知的 。
  • NULL 表示“未知值”,这个值是未知的 。
这就好比我问了一个问题:“美国总统罗斯福的中间名是什么”?
  • 可能有人会回答说:“我不知道罗斯福总统的中间名是什么” 。对于这种情况,可以在数据库中使用 MIDDLE_NAME 列来表示罗斯福的中间名,而这一列的值为 NULL 。
  • 也可能有人会回答说:“罗斯福总统没有中间名 。他的父母没有给他取中间名,所以我知道罗斯福总统确实没有中间名” 。对于这种情况,MIDDLE_NAME 列应该是一个空字符串 。
Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待 。
但只要记住 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手 。
例如,如果你有一个这样的查询语句:
复制代码
SELECT * FROM SOME_TABLEWHERE 1 = 1这个查询会返回所有的行(假设 SOME_TABLE 不是空表),因为表达式“1=1”一定为 true 。
如果我这样写:
复制代码
SELECT * FROM SOME_TABLEWHERE 1 = 0表达式“1=0”是 false,这个查询语句不会返回任何数据 。
但如果我写成这样:
复制代码
SELECT * FROM SOME_TABLEWHERE 1 = NULL这个时候,数据库不知道这两个值(1 和 NULL)是否相等,所以它也不会返回任何数据 。
三元逻辑SQL 查询语句中的 WHERE 一般会有三种结果:
  • 它可以是 true(这个时候会返回数据);
  • 【null有哪些常见的意思?(如何正确理解 SQL 中的 NULL)】它可以是 false(这个时候不会返回数据);
  • 它也可以是 NULL 或未知(这个时候也不会返回数据) 。
你可能会想:“既然这样,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”
接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT() 。
假设有这样的一个查询语句:
复制代码
SELECT * FROM SOME_TABLEWHERE NOT(1 = 1)数据库首先会计算 1=1,这个显然是 true 。
接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false 。
所以,上面的查询不会返回任何数据 。
但如果把语句改成这样:
复制代码
SELECT * FROM SOME_TABLEWHERE NOT(1 = 0)数据库首先会计算 1=0,这个肯定是 false 。
接着,数据库应用 NOT() 条件,这样就得到相反的结果,变成了 true 。
所以,这个语句会返回数据 。