在 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 相关文章推荐
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
SqlServer常用函数及时间处理小结
May 08 SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
mybatis调用sqlserver存储过程返回结果集的方法
SQL Server2019数据库之简单子查询的具有方法
Apr 27 #SQL Server
SQL Server中交叉联接的用法详解
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
php cc攻击代码与防范方法
2012/10/18 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
详解python中的闭包
2020/09/07 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
公务员转正考察材料
2014/02/07 职场文书
环保项目建议书
2014/08/26 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
李强为自己工作观后感
2015/06/11 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
解析redis hash应用场景和常用命令
2021/08/04 Redis