is NULL和= NULL,is not 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_TABLEWHERE NOT(1 = 1)
下面这句呢,显然 NOT() 后会得到 true,当然会返回数据:
SELECT * FROM SOME_TABLEWHERE NOT(1 = 0)
但是这句呢:
SELECT * FROM SOME_TABLEWHERE 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,不相等则返回名列前茅个参数。猜你喜欢LIKE
相关推荐HOT
更多>>siri的工作原理是怎样的?
Siri是苹果公司开发的一种智能个人助手,通过语音识别和自然语言处理技术,可以帮助用户完成各种任务,如发送消息、预定餐厅、调整日程等。那么...详情>>
2023-10-16 22:16:20Go的golang.org/x/系列包和标准库包有什么区别?
1、来源和维护不同golang.org/x/系列包:这个系列的包也被称为”Go扩展库”,是由Go团队和社区共同维护的。这些包并不包含在Go的发行版中,但是...详情>>
2023-10-16 21:03:28行动召唤(Call to Action)的基本设计原则是什么?
行动召唤,或者更常见的英文缩写CTA(Call to Action),是一种强制性的设计元素,旨在引导用户进行特定的行为。这些行为可能包括购买产品、注...详情>>
2023-10-16 19:31:00系统类型中的标准、VHD和VHDX是什?
系统类型中的标准、VHD和VHDX是什么系统类型中的标准、VHD和VHDX是指计算机系统中的不同类型和格式。标准系统类型是指常见的操作系统,如Window...详情>>
2023-10-16 18:39:06热门推荐
时间序列和回归分析有什么本质区别?
沸什么是敏捷开发之Scrum框架?
热Tornado的核心是什么?
热XP(极限编程)有哪些缺点?
新siri的工作原理是怎样的?
机器学习算法中GBDT 和XGBOOST 的区别有哪些?
Go的golang.org/x/系列包和标准库包有什么区别?
无线AP和无线路由器有什么区别?
C语言“悬空指针”和“野指针”是什么意思?
行动召唤(Call to Action)的基本设计原则是什么?
Access 与Excel 最重要的区别是什么?
系统类型中的标准、VHD和VHDX是什?
COOKIE和SESSION有什么区别?
为什么说Java不适合编写桌面应用?