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

发布时间:2026/7/8 5:00:57

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/7/7 15:21:12

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/7/7 20:01:12

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

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

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

2026/7/7 7:00:39

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…

A3908+PIC18F87J11高精度运动控制系统设计

A3908+PIC18F87J11高精度运动控制系统设计

2026/7/8 16:08:49

1. 项目背景与核心需求在工业自动化领域,精密运动控制一直是核心挑战之一。我最近完成了一个高精度运动控制系统的设计项目,采用A3908电机驱动芯片和PIC18F87J11微控制器作为核心组件。这个组合特别适合需要亚毫米级定位精度的应用场景,比如精…

SpringCloud + React19 集成Scalar的API文档

SpringCloud + React19 集成Scalar的API文档

2026/7/8 16:08:49

你好呀,我的老朋友!我是老寇,跟我一起学习集成Scalr API文档 众所周知,Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案,但是社区不太活跃,再加上SpringBoot4发版,迫切需要一个集成…

别给 Electron 鸿蒙 PC 做应用内更新了——autoUpdater 废了,三套方案全翻车,我们最终用了最笨的办法

别给 Electron 鸿蒙 PC 做应用内更新了——autoUpdater 废了,三套方案全翻车,我们最终用了最笨的办法

2026/7/8 16:08:49

先说结论:在鸿蒙 PC 上给 Electron 应用做"应用内自动更新",这事儿目前基本不可能。别折腾了。 我们团队花了两周试了三套方案,每一套都信誓旦旦觉得"这次肯定行",结果每一套都白给。最终我们用了那个看起来最…

计算机大数据毕设实战-基于 Django 框架的租车用户行为可视化系统的设计与实现 基于大数据技术的租车订单数据分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机大数据毕设实战-基于 Django 框架的租车用户行为可视化系统的设计与实现 基于大数据技术的租车订单数据分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

2026/7/8 16:08:49

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026年实测10款降AI率平台推荐:免费与付费全对比,毕业论文淡化AIGC痕迹必看

2026年实测10款降AI率平台推荐:免费与付费全对比,毕业论文淡化AIGC痕迹必看

2026/7/8 16:08:49

一、10 款降 AI 率工具核心测评 1. 千笔AI(毕业论文专用神器) 推荐指数:★★★★★ 核心定位:专注中文论文降 AI 率、降重一体解决方案,以"无口语化、字数稳定、格式保全、性价比极高"为核心优势&#xff…

3分钟快速上手:LanzouAPI蓝奏云直链解析终极指南

3分钟快速上手:LanzouAPI蓝奏云直链解析终极指南

2026/7/8 15:58:48

3分钟快速上手:LanzouAPI蓝奏云直链解析终极指南 【免费下载链接】LanzouAPI 蓝奏云直链,蓝奏api,蓝奏解析,蓝奏云解析API,蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 还在为下载…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/8 6:29:42

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

2026/7/8 0:07:15

1. 项目概述:这不是又一个笔记软件教程,而是一套可复用的“认知操作系统”搭建逻辑你有没有试过,在读完Andrej Karpathy那篇著名的《Software 2.0》之后,满脑子都是“神经网络即代码”的震撼,但合上网页,打…

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

2026/7/8 0:07:15

校园服饰细分赛道测算程序(Python)——学生平价国风 & 机能穿搭市场规模预估(TAM / SAM / SOM)一、实际应用场景描述(真实业务抽象)在《时尚产业与品牌创新》课程中,细分市场切入&#xff0…

Visual C++运行库完整解决方案:告别软件兼容性问题

Visual C++运行库完整解决方案:告别软件兼容性问题

2026/7/8 0:07:15

Visual C运行库完整解决方案:告别软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾为打开游戏时弹出的"DLL缺失"错误…