我的编程空间,编程开发者的网络收藏夹
学习永远不晚

揭开SQL中NULL的神秘面纱

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

揭开SQL中NULL的神秘面纱

这篇文章将揭开 SQL 中 NULL 的神秘面纱。这个问题可能困扰着很多初级开发者。

在查询数据库时,如果你想知道一个列是否为 NULL,SQL 查询语句该怎么写呢?

是不是这样:

SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN = NULL

或者这样写:

SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN IS NULL

正确的写法应该是第二种(WHERE SOME_COLUMN IS NULL)。

为什么要这样写?

在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?

例如,如果我们想要知道一个列的值是否等于 1,WHERE 语句是这样的:

WHERE SOME_COLUMN = 1

那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理 NULL?

因为,在 SQL 中,NULL 表示“未知”。也就是说,NULL 值表示的是“未知”的值。

1NULL 等于未知

在大多数数据库中,NULl 和空字符串是有区别的。

但并不是所有数据库都这样,例如,oracle 就不支持空字符串,它会把空字符串自动转成 NULL 值。

在其他大多数数据库里,NULL 值和字符串的处理方式是不一样的:

  • 空字符串表示“没有值”,这个值是已知的。
  • NULL 表示“未知值”,这个值是未知的。

这就好比我问了一个问题:“美国总统罗斯福的中间名是什么”?

  • 可能有人会回答说:“我不知道罗斯福总统的中间名是什么”。对于这种情况,可以在数据库中使用 MIDDLE_NAME 列来表示罗斯福的中间名,而这一列的值为 NULL。
  • 也可能有人会回答说:“罗斯福总统没有中间名。他的父母没有给他取中间名,所以我知道罗斯福总统确实没有中间名”。对于这种情况,MIDDLE_NAME 列应该是一个空字符串。

Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。

但只要记住 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手。

例如,如果你有一个这样的查询语句:

SELECT * FROM SOME_TABLE
WHERE 1 = 1

这个查询会返回所有的行(假设 SOME_TABLE 不是空表),因为表达式“1=1”一定为 true。

如果我这样写:

SELECT * FROM SOME_TABLE
WHERE 1 = 0

表达式“1=0”是 false,这个查询语句不会返回任何数据。

但如果我写成这样:

SELECT * FROM SOME_TABLE
WHERE 1 = NULL

这个时候,数据库不知道这两个值(1 和 NULL)是否相等,所以它也不会返回任何数据。

2三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:

  • 它可以是 true(这个时候会返回数据);
  • 它可以是 false(这个时候不会返回数据);
  • 它也可以是 NULL 或未知(这个时候也不会返回数据)。

你可能会想:“既然这样,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”

接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT()。

假设有这样的一个查询语句:

SELECT * FROM SOME_TABLE
WHERE NOT(1 = 1)

数据库首先会计算 1=1,这个显然是 true。

接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false。

所以,上面的查询不会返回任何数据。

但如果把语句改成这样:

SELECT * FROM SOME_TABLE
WHERE NOT(1 = 0)

数据库首先会计算 1=0,这个肯定是 false。

接着,数据库应用 NOT() 条件,这样就得到相反的结果,变成了 true。

所以,这个语句会返回数据。

但如果把语句再改成下面这样呢?

SELECT * FROM SOME_TABLE
WHERE NOT(1 = NULL)

数据库首先计算 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 1 = NULL

都不会返回数据,尽管它们是完全相反的。

3NULL 和 NOT IN

如果我有这样的一个查询语句:

SELECT * FROM SOME_TABLE
WHERE 1 IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 true,这个语句将返回数据,因为 1 在括号列表里是存在的。

但如果这么写:

SELECT * FROM SOME_TABLE
WHERE 1 NOT IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 false,这个查询不会返回数据,因为 1 在括号列表里存在,但我们说的是“NOT IN”。

但如果我们把语句改成这样呢?

SELECT * FROM SOME_TABLE
WHERE 5 NOT IN (1, 2, 3, 4, NULL)

这里的 WHRE 不会返回数据,因为它的结果不是 true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。

这个 WHERE 会返回 NULL,所以整个查询不会返回任何数据。

希望你们现在都清楚该怎么在 SQL 语句中处理 NULL 值了。

到此这篇关于揭开SQL中NULL的神秘面纱的文章就介绍到这了,更多相关SQL NULL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

揭开SQL中NULL的神秘面纱

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

揭开SQL中NULL的神秘面纱

这篇文章将揭开 SQL 中 NULL 的神秘面纱。这个问题可能困扰着很多初级开发者。在查询数据库时,如果你想知道一个列是否为 NULL,SQL 查询语句该怎么写呢?是不是这样:SELECT * FROM SOME_TABLEWHER
2023-01-04

揭开JVM中TLAB中的神秘面纱

在开始文章之前,我这里暂且认为大家已经明白了JVM创建对象分配内存地址的流程,也知道JVM内存划分。基于人道主义我还是放一张图吧,大家对照着看。
JVM对象内存2024-12-03

揭开 Python CPython 的神秘面纱

Python CPython 是 Python 语言最受欢迎的实现,在本文中,我们将深入探索 CPython 的内部机制,包括其架构、内存管理和优化技术,帮助您更深入地理解 Python 的底层实现。
揭开 Python CPython 的神秘面纱
2024-03-04

Python 探秘:揭开 OS 神秘面纱

本文将探索 Python中的 os 模块,揭开操作系统的神秘面纱,通过演示代码和实际案例,帮助您掌握 os 模块的基本用法、文件操作、路径操作、系统信息获取、进程管理等知识,从而更深入地理解 Python 与操作系统之间的交互。
Python 探秘:揭开 OS 神秘面纱
2024-02-10

揭开云计算的神秘面纱

下课铃声响了,大雄、静香和叮当一起背着书包放学啦。走着走着大雄突然“啊”了一声说,我U盘忘带了,一会还要去打印课件呢,我得回去取。

一文揭开 NVIDIA CUDA 神秘面纱

今天我们继续来聊一下人工智能生态相关技术 - 用于加速构建 AI 核心算力的 GPU 编程框架 - CUDA 。

揭开 JavaScript 数据类型的神秘面纱

JavaScript 数据类型的多样性让程序员掌握其细微差别至关重要。本文深入探究 JavaScript 的数据类型,阐明它们的特点和应用,以帮助您写出高效、健壮的代码。
揭开 JavaScript 数据类型的神秘面纱
2024-03-06

揭开勒索软件LostTrust的神秘面纱

LostTrust勒索软件于2023年3月开始积极活动,并攻击了多个企业和组织,但直到9月份才被广大研究人员所知晓。

探索Golang Web:揭开其神秘面纱

Golang(又称Go语言)作为一门开源的编程语言,在近年来迅速崛起并广受开发者青睐。其简洁的语法结构、高效的并发处理能力以及强大的标准库都为其赢得了良好的声誉。在Web开发领域,Golang也有着出色的表现,尤其在构建高性能、高并发的We
探索Golang Web:揭开其神秘面纱
2024-03-06

揭开智能指针 Box 的神秘面纱

Box 会在堆上分配空间,存储 T 值,并返回对应的指针。同时 Box 也实现了 trait Deref 解引用和 Drop 析构,当 Box 离开作用域时自动释放空间。
智能指针Box2024-12-02

揭开Linux命令Bash history的神秘面纱

本文将揭开Bash history的神秘面纱,使之成为一个更友好的系统管理工具。

ASP Core 的内幕:揭开 MVC 的神秘面纱

ASP Core MVC 框架为构建动态和响应迅速的 Web 应用程序提供了坚实的基础。揭开其内部机制,了解其组件、管道和请求处理过程。
ASP Core 的内幕:揭开 MVC 的神秘面纱
2024-03-07

一文揭开操作系统的神秘面纱

在如今的世界里,绝大多数人都会对Windows,Linux及MacOS等操作系统有一定的使用经验,但是很多时候对操作系统本身并没有太多感知。毕竟与用户直接打交道的大多数是各种炫酷的客户端软件,包含精美的字体、图标和图片等。
操作系统2024-12-10

编程热搜

目录