SQL 如何处理分析中的缺失值?
发布时间 - 2026-01-23 00:00:00 点击率:次NULL是缺失标记而非值,WHERE中必须用IS NULL而非= NULL;GROUP BY将NULL视为相等并归为一组;JOIN时NULL无法匹配,需用LEFT JOIN配合COALESCE处理。
WHERE 子句中 IS NULL 和 = NULL 的区别必须分清
SQL 里 NULL 不是值,而是“缺失”的标记,所以不能用等号判断。写 WHERE column = NULL 永远不返回任何行,因为 NULL = NULL 返回 UNKNOWN,而 WHERE 只接受 TRUE。
正确写法只有:WHERE column IS NULL 或 WHERE column IS NOT NULL。
- 某些方言(如 PostgreSQL)支持
IS DISTINCT FROM,能安全比较含NULL的字段,但 MySQL、SQL Server 不支持 -
COALESCE(column, 'default')常用来临时替换NULL,但注意它会改变原始数据语义,做统计前要确认是否合理 -
聚合函数如
COUNT(column)自动忽略NULL,但COUNT(*)统计所有行——这点常被误用
GROUP BY 中遇到 NULL 会被当成同一组吗?
是的。在标准 SQL 中,所有 NULL 在 GROUP BY 中被视为相等,会归入同一组。比如 SELECT region, COUNT(*) FROM sales GROUP BY region,所有 region IS NULL 的记录会挤在一行里,显示为 NULL。
如果想把缺失值单独标记(比如叫 'Unknown'),得提前转换:
SELECT COALESCE(region, 'Unknown') AS region_group, COUNT(*) FROM sales GROUP BY COALESCE(region, 'Unknown');
- 别在
GROUP BY里直接写COALESCE(region, 'Unknown')而不重命名,否则 SELECT 列名和 GROUP BY 表达式不一致,在严格模式(如 PostgreSQL)下报错 - MySQL 5.7+ 默认开启
ONLY_FULL_GROUP_BY,要求 SELECT 中所有非聚合列必须出现在 GROUP BY 中,这时候裸写region会失败
窗口函数里 NULL 怎么影响排序和计

ORDER BY 在窗口函数中决定计算顺序,而 NULL 的排序行为因数据库而异:PostgreSQL 默认 NULLS LAST,MySQL 8.0 默认 NULLS FIRST(实际取决于版本和 SQL mode)。这会导致 ROW_NUMBER()、LAG() 等结果不一致。
显式声明更安全:
SELECT id, value,
LAG(value) OVER (ORDER BY created_at NULLS LAST) AS prev_value
FROM logs;
-
LAG(value, 1, 0)的第三个参数是默认值,当上一行是NULL或越界时返回0,避免结果列出现意外NULL -
AVG()窗口函数仍会跳过NULL,但如果你先用ROWS BETWEEN 2 PRECEDING AND CURRENT ROW定义帧,空值不会被“补上”,只是参与计数但不参与求和——容易误判平均值分母
JOIN 时 NULL 匹配逻辑容易引发漏数据
两个表 ON 条件里如果涉及可能为 NULL 的字段(比如 ON a.category_id = b.id),而 a.category_id 是 NULL,那这行一定不会匹配成功——因为 NULL = anything 永远不成立。
若业务上希望把“未知分类”的记录也连过去(比如挂到 b.id IS NULL 的虚拟行),得拆成两步或改用条件逻辑:
- 用
LEFT JOIN保证左表全量,再在 WHERE 或 SELECT 中用COALESCE(b.name, 'Uncategorized')标记 - 避免写
ON a.category_id = b.id OR a.category_id IS NULL——这会引发笛卡尔积,性能爆炸 - 部分场景更适合用
UNION ALL分开处理:先正常 JOIN,再补上a.category_id IS NULL的行并关联默认值
缺失值不是技术边缘问题,它是分析链路里最常被静默吞掉的信息源。每加一层聚合、一次 JOIN、一个窗口定义,都得重新检查 NULL 是否还在按你设想的方式参与计算。
# mysql
# go
# 区别
# 聚合函数
# sql
# NULL
# count
# select
# union
# default
# 严格模式
# column
# postgresql
# 数据库
# 笛卡尔
# 而非
# 这会
# 补上
# 默认值
# 如果你
# 还在
# 出现在
# 它是
# 而不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何快速打造个性化非模板自助建站?
javascript读取文本节点方法小结
如何在Windows虚拟主机上快速搭建网站?
如何选择PHP开源工具快速搭建网站?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在IIS7中新建站点?详细步骤解析
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Python函数文档自动校验_规范解析【教程】
黑客入侵网站服务器的常见手法有哪些?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Laravel如何配置任务调度?(Cron Job示例)
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何在IIS7上新建站点并设置安全权限?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
大型企业网站制作流程,做网站需要注册公司吗?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Android使用GridView实现日历的简单功能
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Laravel怎么为数据库表字段添加索引以优化查询
如何在企业微信快速生成手机电脑官网?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
详解MySQL数据库的安装与密码配置
公司网站制作需要多少钱,找人做公司网站需要多少钱?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
如何在万网利用已有域名快速建站?
详解jQuery中基本的动画方法
如何用已有域名快速搭建网站?
如何用5美元大硬盘VPS安全高效搭建个人网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
EditPlus中的正则表达式 实战(1)
MySQL查询结果复制到新表的方法(更新、插入)
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Android仿QQ列表左滑删除操作
如何在云虚拟主机上快速搭建个人网站?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何快速上传建站程序避免常见错误?
如何为不同团队 ID 动态生成多个独立按钮
使用C语言编写圣诞表白程序
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程

