is NULL和= NULL的区别:is NULL用来判断一个值是否为NULL,= NULL用来判断某个值和NULL是否相等。is not NULL和!= NULL的区别:is not NULL用来判断一个值是否不为NULL,!= NULL用来判断某个值和 NULL 是否不等。
一、is NULL和= NULL的区别
在 SQL 中,is NULL 用来判断一个值是否为 NULL,它是一个布尔表达式,当判断对象为 NULL 时,返回 TRUE;否则返回 FALSE。例如:
SELECT * FROM mytable WHERE mycolumn IS NULL;
这条语句将会查询 mytable 表中 mycolumn 列值为 NULL 的行。
而 = NULL 则不同,因为在 SQL 中,NULL 不是一个常量,而是一个未知的值。因此,当使用 = 操作符判断某个值和 NULL 是否相等时,结果始终为 UNKNOWN。例如:
SELECT * FROM mytable WHERE mycolumn = NULL;
这条语句将返回空集,因为 mycolumn 列中的值无法确定是否等于 NULL。
因此,在 SQL 中,应该使用 is NULL 来判断一个值是否为 NULL。
二、is not NULL和!= NULL的区别
在 SQL 中,is not NULL 是一个布尔表达式,当判断对象不为 NULL 时,返回 TRUE;否则返回 FALSE。例如:
SELECT * FROM mytable WHERE mycolumn IS NOT NULL;
这条语句将会查询 mytable 表中 mycolumn 列值不为 NULL 的行。
而 != NULL 则和 = NULL 一样,因为 NULL 不是一个常量,而是一个未知的值。因此,当使用 != 操作符判断某个值和 NULL 是否不相等时,结果也始终为 UNKNOWN。例如:
SELECT * FROM mytable WHERE mycolumn != NULL;
这条语句将返回空集,因为 mycolumn 列中的值无法确定是否不等于 NULL。
因此,在 SQL 中,应该使用 is not NULL 来判断一个值是否不为 NULL。
三、SQL语言NULL值详解
1、简介
NULL 值代表遗漏的未知数据。默认地,表的列可以存放 NULL 值。如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。NULL 值的处理方式与其他值不同。NULL 用作未知的或不适用的值的占位符。
注意:无法比较 NULL 和 0;它们是不等价的。
2、特点
- null来表示未知和不确定:null 在计算机和编程世界中表示的是未知,不确定。虽然中文翻译为“空”, 但此空(null)非彼空(empty)。null表示的是一种未知状态,未来状态,比如小明兜里有多少钱我不清楚,但也不能肯定为0,这时在计算机中就使用null来表示未知和不确定。
- null不支持大小/相等判断:null表示的是什么都没有,它与空字符串、0 这些是不等价的,是不能用于比较的! 如: 0 = null 、null = ” 、null>3、null!=’hehe’、null<10、age not in (10,20,null)、a!=’null’得到的结果为 false。
正因为以上原因,要少用null。一方面不利于代码的可读性和可维护性,特别是强类型语言,查询 INT 值,结果得到一个 NULL,程序可能会奔溃…如果要兼容这些情况程序往往需要多做很多操作来兜底。另一方面若所在列存在 null值,会影响 count()、 != 、null + 1 等查询、统计、运算情景的结果。
3、处理
请看下面的 “Persons” 表:
假如 “Persons” 表中的 “Address” 列是可选的。这意味着如果在 “Address” 列插入一条不带值的记录,”Address” 列会使用 NULL 值保存。那么我们如何测试 NULL 值呢?无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。我们必须使用 IS NULL 和 IS NOT NULL 操作符。
4、三元逻辑
一个 SQL 语句中 WHERE 子句有三种不同的结果:
- true(会返回数据)
- false(不会返回数据)
- NULL(「未知」也不会返回数据)
好了,那既然 false 和 NULL 都不会返回数据,那干嘛还要关注它们的区别呢?当遇上 NOT() 的时候就有问题了。比如下面这个语句,1 肯定等于 1,显然经过 NOT() 后就会变成 false,那就永远不会返回数据:
SELECT * FROM SOME_TABLE
WHERE NOT(1 = 1)
下面这句呢,显然 NOT() 后会得到 true,当然会返回数据:
SELECT * FROM SOME_TABLE
WHERE NOT(1 = 0)
但是这句呢:
SELECT * FROM SOME_TABLE
WHERE NOT(1 = NULL)
上面这句 1 = NULL 由于数据库不知道 NULL 是什么,「未知」,所以其结果是 NULL。对 NOT() 来说呢,它也不知道 NULL 是什么,该怎么处理,所以也会返回 NULL,所以 WHERE 子句得到的是 NULL,既不是 true 也不是 false 而是 NULL,所以上面这条语句永远都不会返回数据。
那么好了,看下面这两条语句,虽然是相反的条件,但结果一致:都不会查询到数据。
SELECT * FROM SOME_TABLE
WHERE NOT(1 = NULL)
SELECT * FROM SOME_TABLE
WHERE 1 = NULL
5、NOT IN 和 NULL
NOT IN 也是非常值得注意的。比如下面这个 SQL,1 显然在后面的列表中,WHERE 就会得到 true,那么就会查询到数据:
SELECT * FROM SOME_TABLE
WHERE 1 IN (1, 2, 3, 4, NULL)
再看下面这句,显然 1 是在数组中的,那么 NOT IN 就会得到 false,那么就不能查询到数据:
SELECT * FROM SOME_TABLE
WHERE 1 NOT IN (1, 2, 3, 4, NULL)
再看这个:
SELECT * FROM SOME_TABLE
WHERE 5 NOT IN (1, 2, 3, 4, NULL)
先说答案:这句语句不能查询到数据。5 在不在后面的列表中呢?数据库是不知道的,因为里面有个 NULL,谁知道 5 等不等于 NULL(「未知」),不知道,所以 5 NOT IN (1, 2, 3, 4, NULL) 得到的是 NULL,所以查询不到数据。
延伸阅读1:SQL语言NULL值相关函数
- ifnull():两参数,若名列前茅个参数不为空,返回该字段,若为空,返回第二个参数。
- coalesce():多参数,返回名列前茅个非空值。
- nullif():该函数接受两个参数,相等则返回null,不相等则返回名列前茅个参数。