数据库中 SQL 语句该如何处理 NULL 值,你真的了解过吗?

WHERE USER_AGE = 1

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

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

NULL=未知;

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

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

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

空字符(“”)串虽然表示“没有值”,但这个值是已知的。

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

这就好比我问了一个问题:“川建国的小名叫什么?”

有人会回答说:“我不知道川建国的小名是什么”。对于这种情况,可以在数据库中使用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)

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
11748818)]

[外链图片转存中…(img-1KrA7bpH-1720111748819)]

[外链图片转存中…(img-BnANA7Yf-1720111748819)]

[外链图片转存中…(img-xuw3kIAx-1720111748819)]

[外链图片转存中…(img-K6EWOnNI-1720111748820)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值