当前位置:首页 > 杂谈 > 正文内容

NULL是值吗?为什么=NULL会出错?| 一文讲懂SQL NULL-sql语句为null或空值

2023-07-13 12:05:24TONY杂谈159

很多人会将NULL称为“空值”。但这个称呼是非常有迷惑性的。事实上,SQL中的NULL不仅不是“空值”,NULL甚至不能被视作一个“值”。那么,你到底对SQL中的NULL了解多少呢?

此 NULL 非彼 NULL

首先,NULL 不等于0,也不是’(空字符串)。 这很好理解。

其次,NULL 也不是空值。空值,亦是一种值,表示此处确定为空。而 NULL 是一个更未知的状态——可能有值,可能无值,可能存在,可能不存在,可能是任何值,可能不是任何值。总之一切皆有可能。

这一点和许多编程语言都不相同,不少语言中的 NULL,就是空值的意思。例如,在 C、C++ 等语言中,NULL 表示空指针,是一个计算机保留的值,表示不引用有效对象。但是 SQL 中的 NULL 用法和它们并不一样。

最后,NULL 甚至都不是一种值。它不是“无值”,也不是“未知值”,它只是一个标记符号。此处的值不确定,所以用 NULL 作为占位符来标记一下而已。NULL 不是值,NULL 的值不确定,因此 NULL 与 NULL 是不相同的。在逻辑判断中,NULL=NULL 返回的判断结果不是 TRUE ,而是 NULL。因为,未知和未知是无法进行比较的。

想要理解这一点也不难——假设你有两场相亲。在见面之前,你对这两个相亲对象的具体信息一无所知。因此,这俩人对你来说,都是“未知的”,都可以标记为 NULL。但是,你能说这俩人是同一个人吗?不能吧。但是,你能说这俩一定不是同一个人吗?也不一定吧。

NULL 的传递

在 SQL 中,NULL 这个“未知”的状态,是可传递的。譬如,对 NULL 进行算术运算,结果都是NULL。

-- Result is NULL SELECT 2 + NULL; SELECT 2 - NULL; SELECT 2 * NULL; SELECT 2 / NULL;

值得注意的是,用 NULL 除以 0 时,许多数据库系统并不会返回"data exception — division by zero"的错误,而是返回 NULL。例如,MySQL、Oracle、PostgreSQL等等。

-- Result is NULL SELECT NULL / 0;

此外,NULL 还可以运用于字符串的连接中。将 NULL 和其他字符串相连接,其结果也是 NULL。

三值逻辑

理解了 NULL 并非一个值,而是一个符号,才能更好地理解 SQL 中的逻辑判断关系。也许有人不解,NULL是一个值也好,是一个符号也好,有什么区别吗?不都是用来表达“不确定”、“未知”的意思吗?

这区别,可大了去了~。前面我们提到,当将两个 NULL 进行比较时,得到的逻辑运算结果不是 TRUE 而是 NULL 。那么,到底为什么会是这样呢?如果 NULL 值无法进行比较,那么该如何对 NULL 进行筛选和查询呢?

下面,介绍新名词,「三值逻辑」。

首先,我们先来复习一下二值逻辑。 传统的真假逻辑,就是二值逻辑。对于一个给定的命题,它要么为真,要么为假,非真即假,非假即真。在二值逻辑中,逻辑运算的结果只有真和假,不存在任何中间态。

今天下了雨。这句话要么为真,即真的下雨了;要么为假,即今天没下雨。

但是,世间的事情,哪里都是这么简单的非黑即白呢~。非真即假,非好即坏,是理想中的世界,而现实世界要复杂得多。对于一个命题,它不仅有可能是真的,有可能是假的,还有可能是咱不知道的、判断不了的。那么,现在就有真、假、未知,三种结果,即三值逻辑。

今天下雨了。这句话有三种可能性:(1)真,今天下雨了;(2)假,今天没下雨;(3)未知,我今天没出门,不知道今天下没下雨。

NULL ,就是这个表示「未知」的标记符。对于一个命题来说,如果它非真,不意味着它一定为假,因为它也有可能是NULL;如果它非假,也并意味着它一定成立,因为它也有可能是NULL。TRUE/FALSE/NULL,三种逻辑运算结果,形成了三值逻辑体系。

当 NULL 参与逻辑运算时,逻辑运算的结果会变得有些“反直觉”。但只要理解了 NULL 的本质,规律也并不难记住。让我们来逐个击破。

「=」

当对 TRUE 和 FALSE 使用 = 进行判断时,结果很好理解,相同则为真,不同则为佳。那么,涉及到 NULL 呢?

NULL 意味着未知,意味着可能是任何数、任何值。对于不确定的对象,无法使用 = 进行比较。(也无法用 >、<、!= 等符号进行比较)当 = 两边有 NULL 时,结果一律是 NULL。

「IS」

无法对 NULL 进行比较,这可比较麻烦。如果我们需要从数据库中筛选出含/不含 NULL 的数据,该怎么办呢?这个时候,IS 就派上用场了。

使用 IS NULL,可以判断某处的数据是否为 NULL ,而不会将二者进行逻辑比较。

MySQL 中,= NULL 和 IS NULL的执行效果截然不同。

SELECT * FROM table WHERE column1 = NULL; -- 运行结果:未选定任何行数据。(返回 0 行,但不提示语法错误) SELECT * FROM table WHERE column1 IS NULL; -- 运行结果:选出 column1 值为 NULL 的数据。

「NOT」

我们知道,非真即假,非假即真。那么,非 NULL 呢?未知的对立面依然是未知,因此 NULL 的反面也依然是 NULL。

注意区分 NOT NULL 和 IS NOT NULL。在 MySQL 中,在 WHERE 子句中使用 = NOT NULL 时会报错。(1064-error in your SQL syntax)

「OR」

或命题遵从「同假则假,一真则真,其余为 NULL」。见下图。

「AND」

且命题遵从「同真则真,一假则假,其余为 NULL」。见下图。

“NULL是值吗?为什么=NULL会出错?| 一文讲懂SQL NULL-sql语句为null或空值” 的相关文章

抖音seo是什么?抖音SEO优化是什么意思?

抖音seo是什么?抖音SEO优化是什么意思?

原标题:抖音seo是什么?抖音SEO优化是什么意思?1:什么是seo抖音seo是什么?抖音SEO优化是什么意思?现在越来越多的人都在使用抖音这个短视频应用,那么对于抖音来说seo是什么呢?更多干货可以关注柯南的公众号:柯南SEO简单的说,seo是一种提高网站的搜索引擎优化的方法。它可以让你的网站在搜...

泰康人寿尊享世家(增额版)终身寿险即将上市

泰康人寿尊享世家(增额版)终身寿险即将上市

转自:中国银行保险报网 2月20日,泰康人寿尊享世家(增额版)终身寿险即将上市,保障及现金价值年年递增,同时支持“双被保险人”投保。为客户提供终身保障的同时,满足人生各阶段的财富管理及人生规划需求。 随着长寿时代的不断深入,人们对财富增值和资产配置的关注度不断提升。增额终身...

你怎么看待IE浏览器退役?

你怎么看待IE浏览器退役?

和IE浏览器正式说再见的时候,终究是到了。 5月16日,微软Edge浏览器在微博正式公布称,微软IE浏览器将于6月16日正式退役,此后其功能将由Edge浏览器接棒。至此,这个诞生于1995年,有着27年历史的浏览器落下帷幕。...

抖店怎么登录?掌握这些知识轻松开抖店

抖店怎么登录?掌握这些知识轻松开抖店

抖音小店是抖音电商推出的模式,可以帮助抖店商家更好地实现抖音账号的流量变现。虽然说抖音是可以接入第三方链接,但是在从抖音跳转到第三方宝贝详情页的时候会有部分客户流失,转化率低。为了解决这个问题,很多人会选择注册抖音小店,但是要怎么抖店登录呢? 首先商家要确认自己是否符合抖店入驻...

史上最简单电信诈骗预防——铁公鸡心法中国科普博览

史上最简单电信诈骗预防——铁公鸡心法中国科普博览

一、铁公鸡心法简而言之,铁公鸡心法就是:“对骗子可以付出感情,但绝不付出金钱,一毛都没有,没有!” 其实电信诈骗只分两类,被骗的表现分别是这样的:第一种是:“钱!弄了半天这骗子要我出钱!一分也没有!”...

南京贴片代工厂:丝印对于PCBA加工组装的重要性体现在哪

南京贴片代工厂:丝印对于PCBA加工组装的重要性体现在哪

丝印是利用丝印网版对印刷材料进行印刷加工的一种工艺,又称丝网印刷,是一种传统的印刷工艺,它是指在丝网的张力作用下,以遮挡墨汁的方式在印刷材料上形成文字或图案的一种工艺。它对于PCBA加工组装至关重要,云恒小编为大家介绍一下原因。一、丝印可以实现电路板表面的标识在PCBA加工组装中,每个元件都需要进行...