• 售前

  • 售后

热门帖子
入门百科

在SQL中该如那里理NULL值

[复制链接]
尘埃416 显示全部楼层 发表于 2021-8-14 15:00:42 |阅读模式 打印 上一主题 下一主题
在一样平常使用数据库时,你在意过NULL值么?
其实,NULL值在数据库中是一个很特别且有趣的存在,下面我们一起来看看吧;
小搭档想精准查找本身想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

在查询数据库时,假如你想知道一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查询语句该怎么写呢?
是如许:
  1. SELECT * FROM TABLE WHERE USER_AGE = NULL
复制代码
还是如许?
  1. SELECT * FROM TABLE WHERE USER_AGE IS NULL
复制代码
当然,精确的写法应该是第二种(WHERE USER_AGE IS NULL)。
但为什么要如许写呢?在进行数据库数据比力操纵时,我们不会使用“IS”关键词,不是吗?

一脸懵逼

例如,假如我们想要知道一个列的值是否等于 1,WHERE 语句是如许的:
  1. WHERE USER_AGE = 1
复制代码
那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理惩罚 NULL?
由于,在 SQL 中,NULL 表示“未知”。也就是说,NULL 值表示的是“未知”的值。
NULL = 未知;
在大多数数据库中,NULl 和空字符串是有区别的。
但并不是所有数据库都如许,例如,Oracle 就不支持空字符串,它会把空字符串自动转成 NULL 值。
在其他大多数数据库里,NULL 值和字符串的处理惩罚方式是不一样的:
       
  • 空字符("")串固然表示“没有值”,但这个值是已知的。   
  • NULL 表示 “未知值”,这个值是未知的。
这就好比我问了一个题目:“川开国的小名叫什么?”
有人会回复说:“我不知道川开国的小名是什么”。对于这种情况,可以在数据库中使用Nickname列来表示川开国的小名,而这一列的值为 NULL。
也有人会回复说:“川开国没有小名。他的父母没有给他取小名,各人固然不停叫他川二狗,但是我知道川开国确实没有小名”。对于这种情况,Nickname列应该是一个空字符串("")。
Oracle 比力特别,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。
但只要记着 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手。
例如,假如你有一个如许的查询语句:
  1. SELECT * FROM SOME_TABLE WHERE 1 = 1
复制代码
这个查询会返回所有的行(假设 SOME_TABLE 不是空表),由于表达式“1=1”肯定为 true。
假如我如许写:
  1. SELECT * FROM SOME_TABLE WHERE 1 = 0
复制代码
表达式“1=0”是 false,这个查询语句不会返回任何数据。
但假如我写成如许:
  1. SELECT * FROM SOME_TABLE WHERE 1 = NULL
复制代码
这个时间,数据库不知道这两个值(1 和 NULL)是否相称,因此会认定为“NULL”或“未知”,所以它也不会返回任何数据。
  三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:
       
  • 它可以是 true(这个时间会返回数据);   
  • 它可以是 false(这个时间不会返回数据);   
  • 它也可以是 NULL 或未知(这个时间也不会返回数据);

你大概会想:“既然如许,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”
接下来,我来告诉你在哪些情况下会有题目:我们来看看 NOT( ) 方法。
假设有如许的一个查询语句:
  1. SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)
复制代码
数据库起首管帐算 1=1,这个显然是 true。
接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false。
所以,上面的查询不会返回任何数据。
但假如把语句改成如许:
  1. SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)
复制代码
数据库起首管帐算 1=0,这个肯定是 false。
接着,数据库应用 NOT() 条件,如许就得到相反的结果,酿成了 true。
所以,这个语句会返回数据。
但假如把语句再改成下面如许呢?
  1. SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)
复制代码
数据库起首计算 1=NULL,它不知道 1 是否等于 NULL,由于它不知道 NULL 的值是什么。
所以,这个计算不会返回 true,也不会返回 false,它会返回一个 NULL。
接下来,NOT() 会继续解析上一个计算返回的结果。
当 NOT() 碰到 NULL,它会生成另一个 NULL。未知的相反面是另一个未知。
所以,对于这两个查询:
  1. SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)
  2. SELECT * FROM SOME_TABLE WHERE 1 = NULL
复制代码
都不会返回数据,只管它们是完全相反的。
NULL 和 NOT IN
假如我有如许的一个查询语句:
  1. SELECT * FROM TABLE WHERE 1 IN (1, 2, 3, 4, NULL)
复制代码
很显然,WHERE 返回 true,这个语句将返回数据,由于 1 在括号列表里是存在的。
但假如这么写:
  1. SELECT * FROM SOME_TABLE WHERE 1 NOT IN (1, 2, 3, 4, NULL)
复制代码
很显然,WHERE 返回 false,这个查询不会返回数据,由于 1 在括号列表里存在,但我们说的是“NOT IN”。
但假如我们把语句改成如许呢?
  1. SELECT * FROM SOME_TABLE WHERE 5 NOT IN (1, 2, 3, 4, NULL)
复制代码
这里的 WHERE 不会返回数据,由于它的结果不是 true。数字 5 在括号列表里大概不存在,也大概存在,由于当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。
这个 WHERE 会返回 NULL,所以整个查询不会返回任何数据。
希望各人现在都清楚该怎么在 SQL 语句中处理惩罚 NULL 值了。更多相关SQL处理惩罚NULL值内容请搜刮草根技术分享从前的文章或继续浏览下面的相关文章希望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作