共计 2276 个字符,预计需要花费 6 分钟才能阅读完成。
在日常应用数据库时,你在意过 NULL 值么?
其实,NULL 值在数据库中是一个很非凡且乏味的存在,上面咱们一起来看看吧;
在查询数据库时,如果你想晓得一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查问语句该怎么写呢?
是这样:
SELECT * FROM TABLE WHERE USER_AGE = NULL
还是这样?
SELECT * FROM TABLE WHERE USER_AGE IS NULL
当然,正确的写法应该是第二种(WHERE USER_AGE IS NULL)。
但为什么要这样写呢?在进行数据库数据比拟操作时,咱们不会应用“IS”关键词,不是吗?
例如,如果咱们想要晓得一个列的值是否等于 1,WHERE 语句是这样的:
WHERE USER_AGE = 1
那为什么 NULL 值要用 IS 关键字呢?为什么要以这种形式来解决 NULL?
因为,在 SQL 中,NULL 示意“未知”。也就是说,NULL 值示意的是“未知”的值。
NULL = 未知;
在大多数数据库中,NULl 和空字符串是有区别的。
但并不是所有数据库都这样,例如,Oracle 就不反对空字符串,它会把空字符串主动转成 NULL 值。
在其余大多数数据库里,NULL 值和字符串的解决形式是不一样的:
- 空字符(””)串尽管示意“没有值”,但这个值是已知的。
- NULL 示意“未知值”,这个值是未知的。
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 个别会有三种后果:
- 它能够是 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
都不会返回数据,只管它们是齐全相同的。
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 值了。
原文链接:https://blog.csdn.net/qq_3939…
版权申明:本文为 CSDN 博主「_陈哈哈」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!