在 SQL 语句中处理 NULL 值的方法


Posted in SQL Server onJune 07, 2021

在日常使用数据库时,你在意过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 或未知(这个时候也不会返回数据);

在 SQL 语句中处理 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 值的方法的详细内容,更多关于SQL 中的 NULL值的资料请关注三水点靠木其它相关文章!

SQL Server 相关文章推荐
SQL Server基本使用和简单的CRUD操作
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
一次SQL查询优化原理分析(900W+数据从17s到300ms)
Jun 10 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
mybatis调用sqlserver存储过程返回结果集的方法
SQL Server2019数据库之简单子查询的具有方法
Apr 27 #SQL Server
SQL Server中交叉联接的用法详解
You might like
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
TensorFlow损失函数专题详解
2018/04/26 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Django中的静态文件管理过程解析
2019/08/01 Python
python:动态路由的Flask程序代码
2019/11/22 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
党员公开承诺书范文
2014/03/25 职场文书
法人任命书范本
2014/06/04 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
教代会闭幕词
2015/01/28 职场文书
九不准学习心得体会
2016/01/23 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers