= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑
一、概述
1、NULL参与的所有的比较和算术运算符(>,=,<,<>,<=,>=,+,-,*,/) 结果为unknown;
2、unknown的逻辑运算(AND、OR、NOT)遵循三值运算的真值表;
3、如果运算结果直接返回用户,使用NULL来标识unknown
4、如果运算结果是作为条件判断真假,那么需要通过三值逻辑进行运算,并最终通过以下映射逻辑确定整体判定
5、{false、unknown} -> false
6、{true} ->true
7、在UNION 或 INTERSECT等集合运算中,NULL 被视为彼此相等。
二、三值逻辑
在逻辑学中的三值逻辑(three-valued,也称为三元,或三价逻辑,有时缩写为3VL)是几个多值逻辑系统中的其中之一。有三种状态来表示真、假和一个表示不确定的第三值;这相对于基础的二元逻辑(比如布尔逻辑,它只提供真假两种状态)。
三值逻辑有三个真值(true、false、unknown),它的AND、OR、NOT运算的真值表如下:

三、SQL中关于NULL处理的4个陷阱
1、 比较谓词与NULL
null并不能判断表达式为空, 判断表达式为空应该使用is null
goods表有13条数据,其中13条数据的count字段的值是null
select *from goods --14条
错误写法:
select *from goods g where g.count = null --0条
正确写法:
select *from goods g where g.count is null --13条
错误原因:
原因是:g.count= null的结果是unknown;然后unknown判断真假为false。
g.count = null -> unknown -> false;
2、Case When与NULL
错误写法:
case expr when nulll then ‘值1’
并不能判断字段expr为null时, 给字段exper赋值为’值1’
正确写法:
case when expr is null then ‘值1’
select c_name, case when c_nationcode = ‘us’ then ‘USA’
when c_nationcode = ‘cn’ then ‘China’
when c_nationcode is null then ‘China’
else ‘Others’ end
from customer
3、 NOT IN 与NULL
NOT IN 子查询谓词,如果子查询结果集有空值,NOT IN谓词总为假 ,即sql不返回数据
例如goods表里数据的count字段只有1条数据是有值等于1,其余数据count字段值都是NULL。 worker表有9条数据,只有1条数据和goods表关联,worker.id = goods.count。
错误写法:
–查出0条
select *from worker where id not in (select count from goods)
因为使用NOT IN 时,子查询的结果集里有空值,这个SQL永远返回为空。
正确写法1:在子查询里加上非空限制
–查出8条
select *from worker where id not in (select count from goods where count is not null)
正确写法2:将NOT IN子查询改写为not exists子查询
–查出8条
select * from worker where not exists (select count from goods where count = worker.id)
4、修饰符ALL与NULL
ALL修饰的子查询谓词,如果子查询的结果集中有空值,则该谓词总为false。
假设通过下面的sql来获取订单系统关闭后注册的用户。
错误写法:
select * from customer where c_regdate > all(select o_orderdate from orders)
和上面的NOT IN类似的,由于子查询的结果中存在NULL,这个sql不会返回预期的结果。ALL 运算实际执行时也是与返回的结果集一一比较,然后进行AND的运算,最终结果unknown。而unknown作为条件进行评估是,结果为false.
正确写法1:在子查询里加上非空限制
select * from customer where c_regdate > all(select o_orderdate from orders where o_orderdate is not null)
正确写法2:
将expr > all或expr >= all改写为聚集函数 expr > (select max()…)(如果expr < all或expr <= all,则改写为expr < (select min() …)、
select * from customer where c_regdate > (select max(o_custkey) from orders)
–错误写法:0条
select *from worker where id > all (select count from goods)
–正确写法:8条
select *from worker where id > all (select count from goods where count is not null) --8条
select *from worker where id > all (select max(count) from goods) --8条
select *from worker where id <= all (select max(count) from goods) --1条
select *from worker where id <= all (select min(count) from goods) --1条
select *from worker where id > all (select min(count) from goods) --8条
注意:为了sql 优化不建议用聚集函数。


四、总结
1、NULL参与的所有的比较和算术运算符(>,=,<,<>,<=,>=,+,-,*,/) 结果为unknown
2、unknown的逻辑运算(AND、OR、NOT)遵循三值运算的真值表
3、如果运算结果直接返回用户,使用NULL来标识unknown
4、如果运算结果是作为条件判断真假,那么需要通过三值逻辑进行运算,并最终通过以下映射逻辑确定整体判定:
5、 {false、unknown} -> false
6、 {true} ->true
五、场景
接收到外部系统传的车辆配置编码保存在订单表的config_code字段里。在本系统订单表config_code 关联车辆配置表的编码字段code, 在车辆配置表查询内外饰颜色,选装等字段。如果外部系统传的车辆配置编码是空值,那么保存在订单表里的这条数据的config_code字段值也是空。用这条订单数据去关联车辆配置表,就什么也查不出来了。不会报错。
例如:
– goods表和worker表关联,w.id = g.count
–goods表14条数据,13条数据的count字段值为null, 1条数据的count = 1
–worker表9条数据, 数据的id字段值都正常
– 查询结果14条 = goods表和worker表关联的数据量1条 + goods表和worker表没关联的数据量13条
– 查询结果的总数据量=从表关联上主表的数据量+主表没关联上从表的数据量
select g.“name”,g.count ,w.work_number,w.id as wid from
goods g
left join worker w on w.id = g.count

参考文章:https://zhuanlan.zhihu.com/p/560941002
相关文章:
= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑
一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown; 2、unknown的逻辑运算(AND、OR、NOT)遵循三值运算的真值表; 3、如果运算结果直接返回用户,使用NULL来标识unknown 4、如…...
拖拽上传(预览图片)
需求 点击上传图片,或直接拖拽图片到红色方框里面也可上传图片,上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…...
Oracle 12c新特性 In-Memory Column Store
Oracle 12c引入了一项重要的特性——In-Memory Column Store(简称IM或In-Memory),这一特性极大地提升了数据库在处理分析型查询时的性能。以下是关于Oracle 12c In-Memory特性的详细介绍: 一、基本概念 In-Memory Column Store&…...
【数据结构】二叉树———Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
mongodb数据导出与导入
一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本,直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件(适用于 Linux 系统)&am…...
电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)
参考链接1: 电子设计教程29:滞回比较器(施密特触发器) 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓:施密特触发器,正反馈的妙用 参考链接4: 比较器反馈电阻选多大?理解滞后效应,轻…...
NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)
NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…...
JavaWeb day01-HTML入门
Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式...
驱动框架——CMSIS第一部分 RTE驱动框架介绍
一、介绍CMISIS 什么是CMSIS(cortex microcontrol software interface standard一种软件标准接口),官网地址:https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…...
Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器
Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器 一、概述二、连接器的工作原理安全快照初始快照的默认工作流程行为临时快照触发临时增量快照触发临时阻塞快照增量快照增量快照流程Debezium 如何解决具有相同主键的记录之间的冲突快照窗口触发增量快照具有附加…...
保障信息系统安全保护等级调整期间的安全性
保障信息系统安全保护等级调整期间的安全性: 策略与实践 在当今数字化时代,信息系统已成为企业和组织运营的核心支撑。为了适应不断变化的业务需求和安全威胁环境,信息系统安全保护等级的调整成为必要之举。然而,这一调整过程可能…...
实战:shell编程之全量命令练习
概叙 槽点~~~~~~~! 往期shell相关文章回顾,有兴趣的可以自行阅读和练习。 科普文:一文搞懂Vim-CSDN博客 科普文:jvm笔记-CSDN博客 科普文:一天学会shell编程-CSDN博客 科普文:Linux服务器巡检小结_lin…...
在 CentOS 7 上编译安装 Python 3.11
安装必要的依赖 首先,你需要安装一些开发工具和库,以便编译 Python 和 OpenSSL: yum -y groupinstall "Development tools" yum install -y wget gcc-c pcre pcre-devel zlib zlib-devel libffi-devel zlib1g-dev openssl-devel …...
Qt 4.8.7 + MSVC 中文乱码问题深入分析
此问题很常见,然而网上关于此问题的分析大多不够深刻,甚至有错误;加之Qt5又更改了一些编码策略,而很多文章并未提及版本问题,或是就算提了,读者也不重视。这些因素很容易让读者产生误导。今日我彻底研究透了…...
IDEA的常见代码模板的使用
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
arcgis怎么选取某个指定区域地方的数据,比如从全国乡镇数据选取长沙市乡镇数据
一共5个步骤,没一句废话,耐心看完。看完你就会在任何软件选取指定范围的数据了。 一、如图,先将数据加载到arcgis里面,我们要选取里面长沙市的范围数据。 二、选取长沙市的语句 “市” like ‘长沙%’ 切记,切记&…...
二、链表(1)
203.移除链表元素 创建一个虚拟哨兵头节点,就不用考虑原本头结点要不要删除 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def remove…...
KAFKA搭建教程
KAFKA搭建教程 期待您的关注 KAFKA学习笔记 帮助更多人 目录 KAFKA搭建教程 1.下载Kafka并解压 2.添加环境变量 3.修改 server.properties 文件 4.将kafka复制到其它节点 5.修改node1、node2节点的broker.id 6.将master的环境变量同步到node1、 node2 7.启动zookeeper…...
Linux网络——套接字与UdpServer
目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…...
SpringBoot源码深度解析
今天,聊聊SpringBoot的源码,本博客聊的版本为v2.0.3.RELEASE。目前SpringBoot的最新版为v3.3.2,可能目前有些公司使用的SpringBoot版本高于我这个版本。但是没关系,因为版本越新,新增的功能越多,反而对Spri…...
DownKyi:B站视频下载工具的全方位技术解析与应用指南
DownKyi:B站视频下载工具的全方位技术解析与应用指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#x…...
终极桌面歌词解决方案:LyricsX 让你的音乐体验全面升级
终极桌面歌词解决方案:LyricsX 让你的音乐体验全面升级 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 在macOS平台上享受音乐时,你是否曾渴望拥有…...
统计建模大赛的评分标准
2026年统计建模大赛正在进行中,相关文章: 统计建模大赛去哪找数据? 2026年统计建模大赛AI工具使用规范 2026年统计建模大赛选题思路——数字经济统计监测体系研究 我在公开课以及以前的文章中经常强调,数模竞赛不是考试&#…...
当NB-IoT遇上同步轨道卫星:GEO场景下的定时关系增强全指南(基于3GPP Release 17最新规范)
GEO卫星场景下NB-IoT定时关系增强技术解析 1. GEO卫星通信与NB-IoT的技术融合挑战 地球静止轨道(GEO)卫星通信与窄带物联网(NB-IoT)技术的结合,为全球物联网覆盖提供了革命性解决方案。GEO卫星位于地球赤道上空35,786公…...
MIXBOX vs MisstarTools:小米路由器插件管理工具深度对比与选择建议
MIXBOX vs MisstarTools:小米路由器插件生态深度解析与实战指南 当小米路由器遇上第三方插件管理工具,整个设备的可玩性会瞬间提升几个层级。作为长期折腾智能路由的玩家,我几乎试遍了市面上所有主流的小米路由器增强方案,其中最让…...
终极指南:如何快速搭建NixOS配置开发环境 [特殊字符]
终极指南:如何快速搭建NixOS配置开发环境 🚀 【免费下载链接】linux-nixos-hyprland-config-dotfiles Linux 🐧 configuration based on NixOS ❄️, Hyprland, and Catppuccin Macchiato theme 😸 for a consistent, complete, a…...
知识图谱项目实战(基础概念以及工具使用)【第一章】
在RAG以及Agent的应用领域中,知识图谱可以增强知识库的检索效果(通过搭建知识图谱数据库(GraphRag)实现).在教育医疗以及金融领域应用广泛.图谱(graph)有节点和边组成一.知识图谱理论1.1知识图谱的整体架构1.2知识图谱架构实现流程1. 文本标注(Doccano标…...
5分钟解锁WeMod专业版:开源工具让你的游戏修改体验全面升级
5分钟解锁WeMod专业版:开源工具让你的游戏修改体验全面升级 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 还在为WeMod专业版的订阅…...
GNU Parallel进阶指南:解决管道传参的5个常见坑
GNU Parallel进阶指南:解决管道传参的5个常见坑 在数据处理和批量任务处理领域,GNU Parallel堪称瑞士军刀般的存在。这个看似简单的命令行工具,却能让你的工作效率提升数倍。但就像任何强大的工具一样,掌握其精髓需要跨越一些技术…...
Web开发中前端与Node服务中的信息安全与解决办法
Web开发中前端与Node服务中的信息安全与解决办法 input限制特殊字符和长度 漏洞描述: 永远不要相信用户输入的信息,如常规的注入脚本通过input输入之后被页面执行 整改办法 方法1:对于vue项目中ElementUI的el-input 和 原生input <el-in…...
