在 SQL 中,NULL 表示“未知”。 也就是说,NULL 值表示的是“未知”的值。
- NULL = 未知;
在大多数数据库中,NULl 和空字符串是有区别的。
- 空字符("")串虽然表示“没有值”,但这个值是已知的。
-- 表达式“1=1”一定为 true,查询会返回所有的行。
SELECT * FROM SOME_TABLE WHERE 1 = 1
-- 表达式“1=0”是 false,查询语句不会返回任何数据。
SELECT * FROM SOME_TABLE WHERE 1 = 0
-- 数据库不知道(1 和 NULL)是否相等,会认为“NULL”或“未知”,查询语句不会返回任何数据。
SELECT * FROM SOME_TABLE WHERE 1 = NULL
-- WHERE返回false,查询不会返回任何数据。
SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)
-- WHERE返回true,查询返回所有行。
SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)
-- 数据库首先计算 1=NULL,它不知道 1 是否等于 NULL,因为它不知道 NULL 的值是什么。
-- 计算不会返回 true,也不会返回 false,它会返回一个 NULL。
-- NOT() 会继续解析上一个计算返回的结果,NOT() 遇到 NULL,它会生成另一个 NULL。
SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)
-- 都不会返回数据,尽管它们是完全相反的。
SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)
SELECT * FROM SOME_TABLE WHERE 1 = NULL
null vs not in
-- WHERE 返回 true,这个语句将返回数据,因为 1 在括号列表里是存在的。
SELECT * FROM TABLE WHERE 1 IN (1, 2, 3, 4, NULL)
-- WHERE 返回 false,这个语句不会返回数据,因为 1 在括号列表里是存在的。
SELECT * FROM TABLE WHERE 1 NOT IN (1, 2, 3, 4, NULL)
-- WHERE 不会返回数据,因为它的结果不是 true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。
SELECT * FROM SOME_TABLE WHERE 5 NOT IN (1, 2, 3, 4, NULL)