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 NULLWHERE column IS NOT NULL

  • 某些方言(如 PostgreSQL)支持 IS DISTINCT FROM,能安全比较含 NULL 的字段,但 MySQL、SQL Server 不支持
  • COALESCE(column, 'default') 常用来临时替换 NULL,但注意它会改变原始数据语义,做统计前要确认是否合理
  • 聚合函数如 COUNT(column) 自动忽略 NULL,但 COUNT(*) 统计所有行——这点常被误用

GROUP BY 中遇到 NULL 会被当成同一组吗?

是的。在标准 SQL 中,所有 NULLGROUP 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_idNULL,那这行一定不会匹配成功——因为 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自定义表单验证规则教程