在 SQL 中该如何处理NULL值,你真的清楚么?

沙海 2021年5月31日04:31:18Java评论33字数 3226阅读10分45秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/27647.html

在进行数据库数据比较操作时,我们不会使用"IS"关键词,不是吗?对于这种情况,可以在数据库中使用Nickname列来表示川建国的小名,而这一列的值为NULL。WHERE返回true,这个语句将返回数据,因为1在括号列表里是存在的。WHERE返回false,这个查询不会返回数据,因为1在括号列表里存在,但我们说的是"NOT IN"。MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/27647.html

原文约 3321 | 图片 9 | 建议阅读 7 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/27647.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/27647.html

#Java基基文章源自JAVA秀-https://www.javaxiu.com/27647.html

118个文章源自JAVA秀-https://www.javaxiu.com/27647.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/27647.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/27647.html

文章源自JAVA秀-https://www.javaxiu.com/27647.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/27647.html

 文章源自JAVA秀-https://www.javaxiu.com/27647.html

文章源自JAVA秀-https://www.javaxiu.com/27647.html

来源:blog.csdn.net/qq_39390545/article/details/105859502文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在日常使用数据库时,你在意过NULL值么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧;文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查询语句该怎么写呢?文章源自JAVA秀-https://www.javaxiu.com/27647.html

是这样:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM TABLE WHERE USER_AGE = NULL

还是这样?文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM TABLE WHERE USER_AGE IS NULL

当然,正确的写法应该是第二种(WHERE USER_AGE IS NULL )。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但为什么要这样写呢?在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

一脸懵逼文章源自JAVA秀-https://www.javaxiu.com/27647.html

例如,如果我们想要知道一个列的值是否等于 1,WHERE 语句是这样的:文章源自JAVA秀-https://www.javaxiu.com/27647.html

WHERE USER_AGE = 1

那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理 NULL?文章源自JAVA秀-https://www.javaxiu.com/27647.html

因为,在 SQL 中,NULL 表示“未知”。也就是说,NULL 值表示的是“未知”的值。文章源自JAVA秀-https://www.javaxiu.com/27647.html

NULL = 未知;文章源自JAVA秀-https://www.javaxiu.com/27647.html

在大多数数据库中,NULl 和空字符串是有区别的。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但并不是所有数据库都这样,例如,Oracle 就不支持空字符串,它会把空字符串自动转成 NULL 值。文章源自JAVA秀-https://www.javaxiu.com/27647.html

在其他大多数数据库里,NULL 值和字符串的处理方式是不一样的:文章源自JAVA秀-https://www.javaxiu.com/27647.html

  • 空字符("")串虽然表示“没有值”,但这个值是已知的。文章源自JAVA秀-https://www.javaxiu.com/27647.html

  • NULL 表示 “未知值”,这个值是未知的。文章源自JAVA秀-https://www.javaxiu.com/27647.html

这就好比我问了一个问题:“川建国的小名叫什么?”文章源自JAVA秀-https://www.javaxiu.com/27647.html

有人会回答说:“我不知道川建国的小名是什么”。对于这种情况,可以在数据库中使用Nickname 列来表示川建国的小名,而这一列的值为 NULL。文章源自JAVA秀-https://www.javaxiu.com/27647.html

也有人会回答说:“川建国没有小名。他的父母没有给他取小名,大家虽然一直叫他川二狗,但是我知道川建国确实没有小名”。对于这种情况,Nickname 列应该是一个空字符串("")。文章源自JAVA秀-https://www.javaxiu.com/27647.html

Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但只要记住 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手。文章源自JAVA秀-https://www.javaxiu.com/27647.html

例如,如果你有一个这样的查询语句:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE 1 = 1

这个查询会返回所有的行(假设 SOME_TABLE 不是空表),因为表达式“1=1”一定为 true。文章源自JAVA秀-https://www.javaxiu.com/27647.html

如果我这样写:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE 1 = 0

表达式“1=0”是 false,这个查询语句不会返回任何数据。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但如果我写成这样:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE 1 = NULL

这个时候,数据库不知道这两个值(1 和 NULL)是否相等,因此会认定为“NULL”或“未知”,所以它也不会返回任何数据。文章源自JAVA秀-https://www.javaxiu.com/27647.html

三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:文章源自JAVA秀-https://www.javaxiu.com/27647.html

  1. 它可以是 true(这个时候会返回数据);文章源自JAVA秀-https://www.javaxiu.com/27647.html

  2. 它可以是 false(这个时候不会返回数据);文章源自JAVA秀-https://www.javaxiu.com/27647.html

  3. 它也可以是 NULL 或未知(这个时候也不会返回数据);文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

你可能会想:“既然这样,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”文章源自JAVA秀-https://www.javaxiu.com/27647.html

接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT( ) 方法。文章源自JAVA秀-https://www.javaxiu.com/27647.html

假设有这样的一个查询语句:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)

数据库首先会计算 1=1,这个显然是 true。文章源自JAVA秀-https://www.javaxiu.com/27647.html

接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false。文章源自JAVA秀-https://www.javaxiu.com/27647.html

所以,上面的查询不会返回任何数据。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但如果把语句改成这样:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)

数据库首先会计算 1=0,这个肯定是 false。文章源自JAVA秀-https://www.javaxiu.com/27647.html

接着,数据库应用 NOT() 条件,这样就得到相反的结果,变成了 true。文章源自JAVA秀-https://www.javaxiu.com/27647.html

所以,这个语句会返回数据。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但如果把语句再改成下面这样呢?文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)

数据库首先计算 1=NULL,它不知道 1 是否等于 NULL,因为它不知道 NULL 的值是什么。文章源自JAVA秀-https://www.javaxiu.com/27647.html

所以,这个计算不会返回 true,也不会返回 false,它会返回一个 NULL。文章源自JAVA秀-https://www.javaxiu.com/27647.html

接下来,NOT() 会继续解析上一个计算返回的结果。文章源自JAVA秀-https://www.javaxiu.com/27647.html

当 NOT() 遇到 NULL,它会生成另一个 NULL。未知的相反面是另一个未知。文章源自JAVA秀-https://www.javaxiu.com/27647.html

所以,对于这两个查询:文章源自JAVA秀-https://www.javaxiu.com/27647.html

SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)SELECT * FROM SOME_TABLE WHERE 1 = NULL

都不会返回数据,尽管它们是完全相反的。文章源自JAVA秀-https://www.javaxiu.com/27647.html

NULL 和 NOT IN 如果我有这样的一个查询语句:文章源自JAVA秀-https://www.javaxiu.com/27647.html

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

很显然,WHERE 返回 true,这个语句将返回数据,因为 1 在括号列表里是存在的。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但如果这么写:文章源自JAVA秀-https://www.javaxiu.com/27647.html

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

很显然,WHERE 返回 false,这个查询不会返回数据,因为 1 在括号列表里存在,但我们说的是“NOT IN”。文章源自JAVA秀-https://www.javaxiu.com/27647.html

但如果我们把语句改成这样呢?文章源自JAVA秀-https://www.javaxiu.com/27647.html

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

这里的 WHERE 不会返回数据,因为它的结果不是 true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。文章源自JAVA秀-https://www.javaxiu.com/27647.html

这个 WHERE 会返回 NULL,所以整个查询不会返回任何数据。文章源自JAVA秀-https://www.javaxiu.com/27647.html

希望大家现在都清楚该怎么在 SQL 语句中处理 NULL 值了。文章源自JAVA秀-https://www.javaxiu.com/27647.html

文章源自JAVA秀-https://www.javaxiu.com/27647.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

在 SQL 中该如何处理NULL值,你真的清楚么?文章源自JAVA秀-https://www.javaxiu.com/27647.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/27647.html

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/27647.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/27647.html

文章源自JAVA秀-https://www.javaxiu.com/27647.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/27647.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/27647.html

继续阅读
历史上的今天
5月
31
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定