免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

如何正确理解 SQL 中的 NULL

  • 2020-04-01
  • 本文字数:1811 字

    阅读完需:约 6 分钟

如何正确理解SQL中的NULL

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


是不是这样:


SELECT * FROM SOME_TABLEWHERE SOME_COLUMN = NULL
复制代码


或者这样写:


SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL
复制代码


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


为什么要这样写?


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


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


WHERE SOME_COLUMN = 1
复制代码


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


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

NULL 等于未知

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


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


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


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

  • NULL 表示“未知值”,这个值是未知的。


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


  • 可能有人会回答说:“我不知道罗斯福总统的中间名是什么”。对于这种情况,可以在数据库中使用 MIDDLE_NAME 列来表示罗斯福的中间名,而这一列的值为 NULL。

  • 也可能有人会回答说:“罗斯福总统没有中间名。他的父母没有给他取中间名,所以我知道罗斯福总统确实没有中间名”。对于这种情况,MIDDLE_NAME 列应该是一个空字符串。


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


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


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


SELECT * FROM SOME_TABLEWHERE 1 = 1
复制代码


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


如果我这样写:


SELECT * FROM SOME_TABLEWHERE 1 = 0
复制代码


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


但如果我写成这样:


SELECT * FROM SOME_TABLEWHERE 1 = NULL
复制代码


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

三元逻辑

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


  • 它可以是 true(这个时候会返回数据);

  • 它可以是 false(这个时候不会返回数据);

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


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


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


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


SELECT * FROM SOME_TABLEWHERE NOT(1 = 1)
复制代码


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


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


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


但如果把语句改成这样:


SELECT * FROM SOME_TABLEWHERE NOT(1 = 0)
复制代码


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


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


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


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


SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)
复制代码


数据库首先计算 1=NULL,它不知道 1 是否等于 NULL,因为它不知道 NULL 的值是什么。


所以,这个计算不会返回 true,也不会返回 false,它会返回一个 NULL。


接下来,NOT() 会继续解析上一个计算返回的结果。


当 NOT() 遇到 NULL,它会生成另一个 NULL。未知的相反面是另一个未知。


所以,对于这两个查询:


SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)
复制代码



SELECT * FROM SOME_TABLEWHERE 1 = NULL
复制代码


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

NULL 和 NOT IN

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


SELECT * FROM SOME_TABLEWHERE 1 IN (1, 2, 3, 4, NULL)
复制代码


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


但如果这么写:


SELECT * FROM SOME_TABLEWHERE 1 NOT IN (1, 2, 3, 4, NULL)
复制代码


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


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


SELECT * FROM SOME_TABLEWHERE 5 NOT IN (1, 2, 3, 4, NULL)
复制代码


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


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


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

英文原文

Null Values in SQL Queries


2020-04-01 14:152445
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 387.8 次阅读, 收获喜欢 1980 次。

关注

评论 1 条评论

发布
用户头像
涨姿势了,以前确实没有好好思考过null的问题
2020-04-01 23:44
回复
没有更多了
发现更多内容

Python subprocess模块的高级玩法

秃头小帅oi

Python 程序员 低代码 subprocess 前沿

Parallels Desktop 19完美激活秘钥

iMac小白

在线教育如何基于小程序进行技术创新

Onegun

小程序 在线教育

浪潮信息赵帅:实现算力全流程绿色化,推动数据中心可持续发展

财见

Things3 for Mac(日程和任务管理工具) 3.19.3激活破解版

mac

任务管理工具 苹果mac Windows软件 Things 3

Tableau Desktop 2019 for Mac(最好用的数据分析工具)激活版下载

iMac小白

Web 3.0最热门趋势:基于NFT的DAO-NFT和DAO如何彻底改变 Web3.0

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

谷歌趋势官网是什么?谷歌趋势有哪些功能?

九凌网络

FFA 2023|字节跳动 7 项议题入选

字节跳动云原生计算

flink FFA 2023

产学研合作新篇章:东南大学OpenHarmony技术俱乐部成立,专家进校园共谋发展

科技热闻

应用容器化转型系列-容器部署进阶

品高云计算

iOS-打包上架构建版本一直不出现/正在处理/自动消失

雪奈椰子

OpenHarmony亮相MTSC 2023 | 质量&效率共进,赋能应用生态发展

OpenHarmony开发者

OpenHarmony

浪潮信息发布源2.0基础大模型,千亿参数全面开源

财见

C#简化工作之实现网页爬虫获取数据

不在线第一只蜗牛

Java C# 开发 网络爬虫

融云 Global IM UIKit 正式上线,开发更自由,服务更稳定

融云 RongCloud

产品 开发 IM API Global IM UIkit

Native Instruments Kontakt 6 for Mac激活版下载

iMac小白

inBuilder低代码平台新特性推荐-第十一期

inBuilder低代码平台

低代码 开发

「我在淘天做技术」迈步从头越-阿里妈妈广告智能决策技术的演进之路

阿里技术

广告 淘天 阿里妈妈 广告智能决策技术 自动出价

DBeaverUltimate旗舰版下载 数据库管理软件

iMac小白

macOS 14 Sonoma 14.1.1正式版离线安装包下载

iMac小白

谷歌要如何优化引流?谷歌引流有什么优势?

九凌网络

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

小红书技术REDtech

cpu #云原生

HarmonyOS传感器开发指南

HarmonyOS开发者

HarmonyOS

1天开发一个教育类App!我是怎么办到的

FN0

小程序 App

PAM助力企业加强信息安全建设

尚思卓越

运维 网络安全 信息安全 特权账号

PAM为用户带来哪些收益

尚思卓越

网络安全 特权账号

AE插件:GifGun 2.0.12激活破解版 支持AE2023

iMac小白

VPS服务器搭建指南:快速、简单、高效的秘诀大揭秘

一只扑棱蛾子

VPS VPS服务器

解锁Jira本地部署的数据中心版高级功能,打造高效、智能、精细化的项目管理

龙智—DevSecOps解决方案

Jira

anyRTC 融合音视频能力底座:助力企业数字化转型

anyRTC开发者

音视频 视频会议 融合会议 视频监控 电话会议

如何正确理解SQL中的NULL_数据库_MITCHUM_InfoQ精选文章