NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑

发布时间:2026/8/25 10:30:56

NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
关键词NULL、数据库空值、三值逻辑、NULL陷阱、SQL空值处理大家好我是小耶写功课只是为了我踩过的坑你们别再踩了数据库里有一个设计让无数新手怀疑人生——NULL。你以为NULL代表空、“什么都没有”、“等于空白”。但数据库告诉你WHERE column NULL查不出任何数据。你以为COUNT(*)能统计所有行但COUNT(column)却漏掉了一些。你写了一个if (value null)的判断结果数据死活对不上。这一切的根源在于——NULL在数据库里根本不是空值而是一个特殊标记表示未知或不适用。今天把NULL这件事讲清楚帮你避开那些反直觉的坑。几个先搞明白的概念NULL的本质NULL不是空字符串’不是0不是false。它是一个独立的特殊值表示这个字段当前没有确定的值。你可以把它理解成一张问卷上的未作答——它不是否也不是空白而是我不知道。三值逻辑大多数编程语言只有TRUE和FALSE两种结果。但数据库引入了NULL之后逻辑运算变成了三值TRUE、FALSE、UNKNOWN。当运算中涉及NULL时结果可能就是UNKNOWN——而WHERE条件只返回TRUE的行UNKNOWN被当作FALSE处理这就是为什么很多查询查不出数据的根本原因。空字符串 vs NULL空字符串’‘是一个确定的值——它就是一个长度为0的字符串。NULL表示没有值。’和NULL在数据库中是完全不同的两个概念。NULL的五大反直觉陷阱陷阱一WHERE column NULL 查不出任何数据这是新手必踩的坑。-- 你以为这样能查出所有phone为空的记录SELECT*FROMusersWHEREphoneNULL;-- 结果0行-- 正确写法SELECT*FROMusersWHEREphoneISNULL;为什么因为NULL不等于任何东西包括它自己。在数据库中NULLNULL→ UNKNOWN不是TRUENULL!NULL→ UNKNOWN不是TRUENULL NULL的结果是UNKNOWN而WHERE只返回TRUE的行所以查出来是0行。必须用IS NULL或IS NOT NULL来判断。陷阱二COUNT(column) 忽略NULL值-- 假设users表有100行其中10行phone为NULLSELECTCOUNT(*)FROMusers;-- 100统计所有行SELECTCOUNT(phone)FROMusers;-- 90忽略NULL值COUNT()统计行数不管字段是什么。COUNT(column)只统计该字段非NULL的行数。如果你想知道有多少人有手机号用COUNT(phone)如果你想知道总共有多少人用COUNT()。陷阱三NULL参与运算结果还是NULLSELECT1NULL;-- NULLSELECThello||NULL;-- NULLSELECTNULL0;-- UNKNOWN不是FALSESELECTNULL;-- UNKNOWN不是FALSESELECTNULLANDTRUE;-- UNKNOWN不是FALSE任何值和NULL运算结果都是NULL。这在实际业务中会造成很多bug-- 计算员工总薪资SELECTsalarybonusFROMemployees;-- 如果某个员工bonus是NULL整条记录的总薪资就是NULL正确做法是用COALESCE把NULL替换为默认值SELECTsalaryCOALESCE(bonus,0)FROMemployees;-- NULL变成0计算正常陷阱四NOT IN 遇到NULL整个查询结果为空这是最隐蔽的一个。-- 假设子查询返回了 (1, 2, NULL)SELECT*FROMusersWHEREidNOTIN(SELECTuser_idFROMorders);-- 如果orders表里有user_id为NULL的记录整个查询返回0行为什么因为NOT IN在底层展开成WHEREid!1ANDid!2ANDid!NULLid ! NULL的结果是UNKNOWN整个AND表达式变成UNKNOWNWHERE不返回任何行。解决办法用NOT EXISTS替代NOT IN或者在子查询中排除NULL-- 方案一NOT EXISTSSELECT*FROMusers uWHERENOTEXISTS(SELECT1FROMorders oWHEREo.user_idu.id);-- 方案二子查询排除NULLSELECT*FROMusersWHEREidNOTIN(SELECTuser_idFROMordersWHEREuser_idISNOTNULL);陷阱五排序时NULL的位置不同数据库对NULL的排序处理不同SELECT*FROMusersORDERBYphoneASC;-- MySQLNULL排在最前面-- Oracle/PostgreSQLNULL排在最后面如果你不确定NULL的排序行为最好显式指定-- PostgreSQLSELECT*FROMusersORDERBYphoneASCNULLSFIRST;SELECT*FROMusersORDERBYphoneDESCNULLSLAST;-- MySQL用IF/CASE处理SELECT*FROMusersORDERBYIF(phoneISNULL,1,0),phoneASC;NULL的正确打开方式判断NULL用IS NULL或IS NOT NULL别用或!。处理NULL参与计算用COALESCE提供默认值。SELECTCOALESCE(phone,未登记)FROMusers;SELECTsalaryCOALESCE(bonus,0)FROMemployees;聚合函数对NULL的态度函数对NULL的处理COUNT(*)统计所有行不忽略NULLCOUNT(column)忽略该列的NULL值SUM(column)忽略NULL值AVG(column)忽略NULL值且分母也不计NULL行MAX/MIN忽略NULL值GROUP BYNULL值被分到同一组避免NULL的设计思路如果业务上某个字段必须有值在建表时就加上NOT NULL约束并设置默认值CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50)NOTNULL,statusTINYINTNOTNULLDEFAULT0,phoneVARCHAR(20)-- 允许NULL因为确实可能没登记);能NOT NULL的字段就别留NULL。NULL存在的每一处都是未来查询时可能踩的坑。总结NULL不是空值是未知。记住三句话判断NULL用IS NULL别用NULL参与运算结果是NULL用COALESCE处理NOT IN遇到NULL会吞掉所有结果改用NOT EXISTS建表时能NOT NULL就别留NULL少一个NULL少十个bug。小耶在手SQL不愁。还有什么想了解的欢迎留言小耶一定知无不言言无不尽……我们下次见~参考文献SQL-92标准 - 三值逻辑规范《SQL反模式》第12章NULL的处理陷阱MySQL 8.0 Reference Manual - Working with NULLhttps://dev.mysql.com/doc/refman/8.0/en/working-with-null.htmlPostgreSQL Documentation - Null Valueshttps://www.postgresql.org/docs/current/functions-comparison.html

相关新闻

Windows Defender一键禁用工具:彻底解决系统防护干扰的终极方案

Windows Defender一键禁用工具:彻底解决系统防护干扰的终极方案

2026/8/25 2:26:51

Windows Defender一键禁用工具:彻底解决系统防护干扰的终极方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mi…

端到端AI如何驱动Robotaxi成本降至几美分一英里?

端到端AI如何驱动Robotaxi成本降至几美分一英里?

2026/8/25 10:29:12

1. 项目概述:当“堵车党”遇上“几美分一英里”的Robotaxi最近,特斯拉AI领域的重量级人物在ScaledML大会上的演讲,像一颗投入平静湖面的石子,激起了远超技术圈层的涟漪。演讲的核心信息极具冲击力:通过端到端AI技术&am…

Sysboost核心组件解析:elfmerge、sysboostd与加载器的协同工作原理

Sysboost核心组件解析:elfmerge、sysboostd与加载器的协同工作原理

2026/8/25 1:47:30

Sysboost核心组件解析:elfmerge、sysboostd与加载器的协同工作原理 【免费下载链接】sysboost Sysboost converts dynamic links into static links by combining executable files and dynamic library files. This reduces the overhead and delay of dynamic lin…

OpenClaw AI智能体安全平台部署与实战:从零构建自动化安全运营中心

OpenClaw AI智能体安全平台部署与实战:从零构建自动化安全运营中心

2026/8/25 10:25:02

1. 项目概述:当“养虾”成为安全工程师的新黑话最近在安全圈和AI开发者社群里,“养虾”这个词突然火了起来。不明就里的朋友可能以为我们在讨论水产养殖,但实际上,这指的是部署和运维一个名为“OpenClaw”(因其图标酷似…

OpenClaw AI智能体框架实战:3步部署、3大核心Skill与5个应用案例详解

OpenClaw AI智能体框架实战:3步部署、3大核心Skill与5个应用案例详解

2026/8/25 10:25:02

1. 项目概述:为什么OpenClaw值得你花时间? 最近在AI应用开发圈子里,OpenClaw这个名字出现的频率越来越高。简单来说,它是一个开源的AI智能体(Agent)开发与部署框架,你可以把它理解为一个“乐高…

AI大模型赋能安全测试实战:内网渗透、代码审计与漏洞利用

AI大模型赋能安全测试实战:内网渗透、代码审计与漏洞利用

2026/8/25 10:25:02

1. 从“人肉扫描”到“智能协同”:安全测试的范式转移 如果你和我一样,在安全测试这个行当里摸爬滚打了几年,一定经历过这样的场景:面对一个庞大的内网资产列表,手动一个个IP去扫端口、识别服务、测试弱口令&#xff0…

Python集合与字典深度解析:从哈希表原理到实战应用场景

Python集合与字典深度解析:从哈希表原理到实战应用场景

2026/8/25 10:25:02

1. 项目概述:从“容器”到“工具”的认知跃迁刚接触Python那会儿,我也曾把set和dict混为一谈,觉得它们都是用来装东西的“容器”,无非一个装单个元素,一个装键值对。直到在项目里踩了几个不大不小的坑,比如…

Python集合与字典深度解析:从哈希表原理到高效应用场景

Python集合与字典深度解析:从哈希表原理到高效应用场景

2026/8/25 10:25:02

1. 项目概述:从“容器”到“映射”,理解Python两大核心数据结构在Python的日常开发中,set(集合)和dict(字典)是高频使用的两个内置数据结构。很多刚入门的开发者,甚至一些有经验的程…

标定技术全解析:从传感器到系统,分类、原理与实战指南

标定技术全解析:从传感器到系统,分类、原理与实战指南

2026/8/25 10:15:02

1. 项目概述:从“标定”说起,为什么分类是第一步在工业自动化、机器视觉、自动驾驶乃至消费电子领域,“标定”这个词出现的频率越来越高。你可能在调试一台工业相机时听到它,也可能在研究手机摄像头算法时碰到它。简单来说&#x…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/24 19:53:32

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/24 19:56:07

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

2026/8/25 0:04:35

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

2026/8/25 0:04:35

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…