这就好比我问了一个问题:“川建国的小名叫什么?”
有人会回答说:“我不知道川建国的小名是什么”。对于这种情况,可以在数据库中使用Nickname列来表示川建国的小名,而这一列的值为NULL。
也有人会回答说:“川建国没有小名。他的父母没有给他取小名,大家虽然一直叫他川二狗,但是我知道川建国确实没有小名”。对于这种情况,Nickname列应该是一个空字符串(“”)。
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)是否相等,因此会认定为“NULL”或“未知”,所以它也不会返回任何数据。
三元逻辑
SQL 查询语句中的 WHERE 一般会有三种结果:
1、它可以是 true(这个时候会返回数据);
2、它可以是 false(这个时候不会返回数据);
3、它也可以是 NULL 或未知(这个时候也不会返回数据);
你可能会想:“既然这样,那我为什么要去关心是false还是NULL?它们不是都不会返回数据吗?”
接下来,我来告诉你在哪些情况下会有问题:我们来看看NOT()方法。
假设有这样的一个查询语句:
SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)
数据库首先会计算1=1,这个显然是true。微信小程序“Java精选面试题”,内涵3000+道面试题,覆盖初级、中级、高级工程师面试题。
接着,数据库会应用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
都不会返回数据,尽管它们是完全相反的。
NULL 和 NOT IN
如果我有这样的一个查询语句:
SELECT * FROM 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)
这里的WHERE不会返回数据,因为它的结果不是true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个NULL值(数据库不知道 NULL的值是什么)。
这个WHERE 会返回NULL,所以整个查询不会返回任何数据。
希望大家现在都清楚该怎么在SQL语句中处理NULL值了。
作者:_陈哈哈
blog.csdn.net/qq_39390545/article/details/105859502
往期精选 点击标题可跳转
纳尼?Spring Boot 项目中使用 CommandLineRunner 有坑!
为什么数据库连接池要用 ThreadLocal 呢?不用会怎么样?
面试官问:线程池如何重复利用空闲的线程来执行任务?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
alt=“img” style=“zoom: 33%;” />
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-HdlM4bJk-1713710275232)]
[外链图片转存中…(img-KrPEciVo-1713710275233)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!