SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL

或者这样写:

复制代码WHERE SOME_COLUMN = 1

正确的写法应该是第二种(WHERE SOME_COLUMN IS NULL)。

为什么要这样写?

在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?

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

复制代码WHERE SOME_COLUMN = 1

那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理 NULL?

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

NULL 等于未知

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

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

在其他大多数数据库里,NULL 值和字符串的处理方式是不一样的:空字符串表示“没有值”,这个值是已知的。

NULL 表示“未知值”,这个值是未知的。

这就好比我问了一个问题:“美国总统罗斯福的中间名是什么”?可能有人会回答说:“我不知道罗斯福总统的中间名是什么”。对于这种情况,可以在数据库中使用 MIDDLE_NAME 列来表示罗斯福的中间名,而这一列的值为 NULL。

也可能有人会回答说:“罗斯福总统没有中间名。他的父母没有给他取中间名,所以我知道罗斯福总统确实没有中间名”。对于这种情况,MIDDLE_NAME 列应该是一个空字符串。

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

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

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

复制代码SELECT * FROM SOME_TABLEWHERE 1 = 1

这个查询会返回所有的行(假设 SOME_TABLE 不是空表),因为表达式“1=1”一定为 true。

如果我这样写:

复制代码SELECT * FROM SOME_TABLEWHERE 1 = 0

表达式“1=0”是 false,这个查询语句不会返回任何数据。

但如果我写成这样:

复制代码SELECT * FROM SOME_TABLEWHERE 1 = NULL

这个时候,数据库不知道这两个值(1 和 NULL)是否相等,所以它也不会返回任何数据。

三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:它可以是 true(这个时候会返回数据);

它可以是 false(这个时候不会返回数据);

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

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

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

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

复制代码SELECT * FROM SOME_TABLEWHERE NOT(1 = 1)

数据库首先会计算 1=1,这个显然是 true。

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

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

但如果把语句改成这样:

复制代码SELECT * FROM SOME_TABLEWHERE NOT(1 = 0)

数据库首先会计算 1=0,这个肯定是 false。

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

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

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

复制代码SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)

数据库首先计算 1=NULL,它不知道 1 是否等于 NULL,因为它不知道 NULL 的值是什么。

所以,这个计算不会返回 true,也不会返回 false,它会返回一个 NULL。

接下来,NOT() 会继续解析上一个计算返回的结果。

当 NOT() 遇到 NULL,它会生成另一个 NULL。未知的相反面是另一个未知。

所以,对于这两个查询:

复制代码SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)

复制代码SELECT * FROM SOME_TABLEWHERE 1 = NULL

都不会返回数据,尽管它们是完全相反的。

NULL 和 NOT IN

如果我有这样的一个查询语句:

复制代码SELECT * FROM SOME_TABLEWHERE 1 IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 true,这个语句将返回数据,因为 1 在括号列表里是存在的。

但如果这么写:

复制代码SELECT * FROM SOME_TABLEWHERE 1 NOT IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 false,这个查询不会返回数据,因为 1 在括号列表里存在,但我们说的是“NOT IN”。

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

复制代码SELECT * FROM SOME_TABLEWHERE 5 NOT IN (1, 2, 3, 4, NULL)

这里的 WHRE 不会返回数据,因为它的结果不是 true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。

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

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

本文地址:https://www.best73.com/news/56845.html

在MySQL中 NULL的含义是_null有哪些常见的意思?(如何正确理解 SQL 中的 NULL)相关推荐

  1. 正确理解WPF中的TemplatedParent

    原文:正确理解WPF中的TemplatedParent http://www.cnblogs.com/mgen/archive/2011/08/31/2160581.html (注:Logical T ...

  2. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  3. matlab计算正负零序分量,5分钟教你正确理解电力系统中的正序负序零序.doc

    5分钟教你正确理解电力系统中的正序负序零序 电力 三相不平衡 作图法 对称分量法 1:三相不平衡的的电压(或电流),可以分解为平衡的正序.负序和零序 2:零序为3相电压向量相加,除以3 3:正序将BC ...

  4. 正确理解scipy中的coo_matrix函数

    正确理解scipy中的coo_matrix函数 1. 构造一个空矩阵 2. 使用ijv(triplet)格式构造一个矩阵 3. 用重复的索引构造矩阵 1. 构造一个空矩阵 这种用法比较简单,直接生成一 ...

  5. sql如何处理null值_如何正确处理SQL中的NULL值

    sql如何处理null值 前言 (Preface) A friend who has recently started learning SQL asked me about NULL values ...

  6. 如何理解SQL中的自连接?

    与点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 说起自连接,想必小伙伴们都听说过.在进行数据处理时经常会使用到自连接,特别是像一些连 ...

  7. 深入理解 SQL 中的 Grouping Sets 语句

    前言 SQL 中 Group By 语句大家都很熟悉,根据指定的规则对数据进行分组,常常和聚合函数一起使用. 比如,考虑有表 dealer,表中数据如下: id (Int) city (String) ...

  8. 2.如何正确理解古典概率中的条件概率《zobol的考研概率论教程》

    写本文主要是帮助粉丝理解考研中的古典概率-条件概率的具体定义. "B事件发生的条件下,A事件发生的概率"? "在A集合内有多少B的样本点"? "在B约 ...

  9. 正确理解javascript中的Event loop机制

    这两个星期一直在想着写一篇关于javascript中event Loop的文章.自从写完上一篇<Javascript捕捉(capturing)与冒泡(bubbling)的区别>之后,我抛出 ...

最新文章

  1. Velodyne VLP-16激光雷达数据分析
  2. (转)教你实现Winform窗体的四边阴影效果
  3. STM32F405的 ADC参考电压选择问题
  4. 运筹学的课程笔记 markov decision process
  5. 如何区分Oracle的数据库,实例,服务名,SID
  6. 「数据库系列四」分布式数据库CAP理论与最终一致性
  7. TCP/IP GUIDE
  8. upc 组队赛18 STRENGTH【贪心模拟】
  9. JS根据文本框内容匹配并高亮显示
  10. sql查询 关联帖子_MySQL的大分页查询该如何优化?
  11. C++新特性探究(18.3):C++11 weak_ptr智能指针
  12. mysql 分页_百万数据下mysql分页问题
  13. 凡泰极客:远程办公,你礼貌吗?
  14. ZigBee 快速入门(协议栈,协调器,路由器,终端设备,加入网络,安全,路由功能,频段)
  15. 安卓模拟器安装xposed和插件
  16. 数据安全风险分析及应对策略研究
  17. LabWindows 读写 Excel
  18. 先是艾瑞咨询后是腾讯,永洪科技把客户变成了投资人
  19. php设置pdf下载加密文件,pdf文件加密方法 PDF文件怎样加密 如何给PDF文件添加打开口令...
  20. 常用crc查表法_请教查表法计算CRC的原理

热门文章

  1. Windows10下删除需TrustedInstaller权限的目录或文件
  2. NLTK库来咬文嚼字
  3. 计算机行业岗位排名,全国“最缺工”100个职业排行,这些专业就业率高,发展前景好...
  4. 快速省时省事的视频转换器
  5. 几款工具神器,高效率助你走上人生巅峰
  6. nsis制作新版迅雷安装界面
  7. 期货长线交易资金管理(浮赢加仓)?
  8. 好声音”杨坤组大森蝶晋级 被传与刘珂有恋情
  9. CSDN日报20170218——《你真的看懂无领导小组面试了吗?》
  10. iphone手机可不可以运行java_只要一招 就能在iPhone手机上运行安卓系统