sqlifnull如何使用(在 SQL 语句中处理 NULL 值的方法)
sqlifnull如何使用
在 SQL 语句中处理 NULL 值的方法在日常使用数据库时,你在意过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 或未知(这个时候也不会返回数据);
你可能会想:“既然这样,那我为什么要去关心是 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值的资料请关注开心学习网其它相关文章!
- sqlserver分表后如何查询(SQL Server中row_number分页查询的用法详解)
- innodb和myisam(Mysql InnoDB和MyISAM区别原理解析)
- sql server支持两种登录验证方式(远程登陆SQL Server 2014数据库的方法)
- 如何正常查看mysql存储数据文件(Mysql文件存储图文详解)
- mysql冷热数据分离方案(MySQL中使用流式查询避免数据OOM)
- sql server 分布式事务(Sql Server事务语法及使用方法实例分析)
- sqlserver中根据类型分组(SQL SERVER 分组求和sql语句)
- 如何在mysql中批量插入数据(MySQL如何快速批量插入1000w条数据)
- SQLServer中JSON文档型数据的查询问题解决(SQLServer中JSON文档型数据的查询问题解决)
- mysql开启事务没有提交(MySQL 事务autocommit自动提交操作)
- sqlserver备份还原数据(通过Windows批处理命令执行SQL Server数据库备份)
- sqlserver字符串截取填充(SQL Server实现split函数分割字符串功能及用法示例)
- mysql导出数据的方法
- mysql建表时指定聚簇索引(一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的)
- phpstudymysql数据库启动不了(phpstudy mysql启动不了的解决方法)
- mysql出现的问题及解决方法(mysql升级到5.7时,wordpress导数据报错1067的问题)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
- 白龙马的改编学生版,快来看看(白龙马的改编学生版)
- 萌娃唱《白龙马》走红,那生动的小表情,网友直呼 简直是戏精(萌娃唱白龙马走红)
- 朱鹤松被不断认可,凤凰传奇玲花喊话岳云鹏,索要老朱演出门票(朱鹤松被不断认可)
- 元宵晚会槽点多,芒果台上来就假唱,岳云鹏不说相声改评书了(元宵晚会槽点多)
热门推荐
- css技巧100个(css小技巧汇总)
- python3语法规则(Python3解释器知识点总结)
- php nginx 底层执行流程(nginx/apache/php隐藏http头部版本信息的实现方法)
- sql如何合并多个表中的数据(SQL 列不同的表查询结果合并操作)
- python怎么提取微信数据(使用Python+wxpy 找出微信里把你删除的好友实例)
- css绝对布局和相对布局(如何理解 CSS 布局和块级格式上下文)
- mysql数据库触发器(MySQL中使用游标触发器的方法)
- 三种css选择符(浅谈css之属性及剩余的选择符)
- mysql清空数据库所有表格(MySQL用truncate命令快速清空一个数据库中的所有表)
- python代码返回值(Python 函数返回值的示例代码)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9