如何正确理解 SQL 中的 NULL 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有哪些常见的意思?】因为 , 在 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(这个时候会返回数据);
  • 它可以是 false(这个时候不会返回数据);
  • 它也可以是 NULL 或未知(这个时候也不会返回数据) 。
你可能会想:“既然这样 , 那我为什么要去关怀是 false 还是 NULL?它们不是都不会返回数据吗?”
接下来 , 我来告知你创业网在哪些情形下会有问题:我们来看看 NOT() 。
假设有这样的一个查询语句:
复制代码
SELECT * FROM SOME_TABLEWHERE NOT(1 = 1)数据库首先会盘算 1=1 , 这个显然是 true 。
接着 , 数据库会运用 NOT() 条件 , 所以 WHERE 返回 false 。
所以 , 上面的查询不会返回任何数据 。
但如果把语句改成这样:
复制代码
SELECT * FROM SOME_TABLEWHERE NOT(1&n创业网bsp;= 0)数据库首先会盘算 1=0 , 这个确定是 false 。
接着 , 数据库运用 NOT() 条件 , 这样就得到相反的成果 , 变成了 true 。
所以 , 这个语句会返回数据 。
但如果把语句再改成下面这样呢?
复制代码
SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)数据库首先盘算 1=NULL , 它不知道 1 是否等于 NULL , 因为它不知道 NULL 的值是什么 。
所以 , 这个盘算不会返回 true , 也不会返回 false , 它会返回一个 NULL 。
接下来 , NOT() 会持续解析上一个盘算返回的成果 。
当 NOT() 遇到 NULL , 它会生成另一个 NULL 。未知的相反面是另一个未知 。
所以 , 对于这两个查询:

推荐阅读