在SQL中该如何处理NULL值

在日常使用数据库时,你在意过null值么?

其实,null值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧;

小伙伴想精准查找自己想看的mysql文章?喏 → mysql专栏目录 | 点击这里

在查询数据库时,如果你想知道一个列(例如:用户注册年限 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 表示 “未知值”,这个值是未知的。

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

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

  • 它可以是 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 值了。更多相关sql处理null值内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐