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

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

在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查询语句该怎么写呢?

是这样:

SELECT * FROM TABLE WHERE USER_AGE = NULL
SELECT * FROM TABLE WHERE USER_AGE IS NULL

但为什么要这样写呢?在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?

例如,如果我们想要知道一个列的值是否等于 1,WHERE 语句是这样的:

WHERE USER_AGE = 1

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

NULL = 未知;

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

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

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

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

Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。

但只要记住 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手。

例如,如果你有一个这样的查询语句:

SELECT * FROM SOME_TABLE WHERE 1 = 1

如果我这样写:

SELECT * FROM SOME_TABLE WHERE 1 = 0

但如果我写成这样:

SELECT * FROM SOME_TABLE WHERE 1 = NULL

三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:

  • 它可以是 true(这个时候会返回数据);
  • 它可以是 false(这个时候不会返回数据);
  • 它也可以是 NULL 或未知(这个时候也不会返回数据);

你可能会想:“既然这样,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”

接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT( ) 方法。

假设有这样的一个查询语句:

SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)

接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false。

所以,上面的查询不会返回任何数据。

但如果把语句改成这样:

SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)

接着,数据库应用 NOT() 条件,这样就得到相反的结果,变成了 true。

所以,这个语句会返回数据。

但如果把语句再改成下面这样呢?

SELECT * FROM SOME_TABLE WHERE NOT(1 = 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)

但如果这么写:

SELECT * FROM SOME_TABLE WHERE 1 NOT IN (1, 2, 3, 4, NULL)

但如果我们把语句改成这样呢?

SELECT * FROM SOME_TABLE WHERE 5 NOT IN (1, 2, 3, 4, NULL)

这个 WHERE 会返回 NULL,所以整个查询不会返回任何数据。

希望大家现在都清楚该怎么在 SQL 语句中处理 NULL 值了。

更多相关文章

  1. MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法
  2. ES6 变量声明,箭头函数,数组方法,解构赋值,JSON,类与继承,模块化练习
  3. 浅谈Java中Collections.sort对List排序的两种方法
  4. Python list sort方法的具体使用
  5. python list.sort()根据多个关键字排序的方法实现
  6. android上一些方法的区别和用法的注意事项
  7. android实现字体闪烁动画的方法
  8. Android中dispatchDraw分析
  9. Android四大基本组件介绍与生命周期

随机推荐

  1. 布局技巧和列表控件
  2. Android ScrollView滚动条
  3. android sdk的快速安装法
  4. Android基本控件TextView
  5. Android应用程序的debug属性
  6. GridView相关
  7. Android Activity 的四种启动模式 lunchM
  8. android 布局学习
  9. Android(安卓)网络图片加载
  10. Android ListView 设置