在数据库的日常使用中,空值是数据库中一个非常特殊而有趣的存在。本文介绍了SQL中如何处理空值,有兴趣的可以看看。
在数据库的日常使用中,你在乎空值吗?
实际上,空值是数据库中一个非常特殊和有趣的存在。让我们一起来看看吧。
小伙伴想精准查找自己想看的MySQL文章?喏 MySQL专栏目录 | 点击这里
查询数据库时,如果想知道某一列(例如用户注册年份USER_AGE)是否为空,如何写SQL查询语句?
是这样的:
TABLE WHERE USER _ AGE=NULL的表
还这样?
SELECT * FROM USER _ AGE为空的表
当然,正确的写法应该是第二种(
WHERE USER_AGE IS NULL
)。但是为什么要这样写呢?我们不会在比较数据库数据时使用“IS”关键字吧?
完全糊涂了
例如,如果我们想知道一列的值是否等于1,WHERE语句看起来像这样:
其中用户年龄=1
那么为什么对空值使用IS关键字呢?为什么要这样处理NULL?
因为,
在 SQL 中,NULL 表示“未知”。也就是说,NULL 值表示的是“未知”的值。
NULL=未知;
在大多数数据库中,NULl和空字符串是有区别的。
但是并不是所有的数据库都是这样的。例如,Oracle不支持空字符串,它会自动将空字符串转换为空值。
在大多数其他数据库中,空值和字符串的处理方式不同:
虽然空字符(“”)字符串表示“没有值”,但是这个值是已知的。
NULL表示“未知值”。该值未知。
就像我问了一个问题:“川建国的外号是什么?”
有人会回答“我不知道川建国的外号是什么”。在这种情况下,可以使用
Nickname
列来表示川建国在数据库中的昵称,该列的值为NULL。还有人会回复,“川建国没有外号。他的父母没有给他起绰号。虽然大家一直叫他川二狗,但我知道川建国并没有外号”。在这种情况下,列
Nickname
应该是空字符串(“”)。Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。
但只要记住NULL代表一个未知值,那么在编写SQL查询语句时就会得心应手。
例如,如果您有这样一个查询语句:
SELECT * FROM SOME_TABLE其中1=1
该查询将返回所有行(假设SOME_TABLE不是空表),因为表达式“1=1”必须为真。
如果我这样写:
SELECT * FROM SOME_TABLE其中1=0
表达式“1=0”为假,此查询语句不会返回任何数据。
但是如果我这样写:
SELECT * FROM SOME_TABLE,其中1=NULL
此时数据库不知道这两个值(1和NULL)是否相等,所以会被视为“NULL”或“unknown”,所以也不会返回任何数据。
三元逻辑
在SQL查询语句中WHERE一般有三个结果:
可以是真的(此时会返回数据);
可以是假的(此时不会返回任何数据);
也可以为空或未知(此时不会返回任何数据);
你可能会想,“在这种情况下,我为什么要关心它是假的还是空的呢?不都是返回数据吗?”
接下来我来告诉你在哪些情况下会出现问题:我们来看看
NOT( )
的方法。假设有这样一个查询语句:
SELECT * FROM SOME _ TABLE WHERE NOT(1=1)
首先,数据库会计算出1=1,这显然是对的。
接下来,数据库应用NOT()条件,因此WHERE返回false。
因此,上述查询不会返回任何数据。
但是如果你把陈述改成这样:
SELECT * FROM SOME _ TABLE WHERE NOT(1=0)
首先,数据库会计算出1=0,这一定是假的。
然后,数据库应用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,其中1=NULL
不会返回数据,虽然两者完全相反。
空且不在
如果我有这样一个查询语句:
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存在于括号列表中,但我们说的是“不在”。
但是如果我们把陈述改成这样呢?
SELECT * FROM SOME _ TABLE WHERE 5 NOT IN(1,2,3,4,NULL)
其中这里不返回数据,因为它的结果不为真。数字5可能不存在,也可能在括号列表中存在,因为里面有空值(数据库不知道空值是什么)。
这个WHERE将返回NULL,所以整个查询不会返回任何数据。
我希望现在每个人都知道如何处理SQL语句中的空值。有关SQL处理空值的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!