STDDEV和VARIANCE是标准SQL聚合函数,天然支持GROUP BY;默认为样本算法(分母n−1),需用_POP版本计算总体;自动忽略NULL,单值组时_SAMP返回NULL、_POP返回0。

STDDEV 和 VARIANCE 函数在分组查询中是否可用
完全可用,且是标准 SQL(SQL:2003 起)和主流数据库(PostgreSQL、Oracle、MySQL 8.0+、SQL Server 2022+)原生支持的聚合函数。它们天然适配 GROUP BY,不需要额外子查询或窗口语法就能直接计算每组的标准差与方差。
注意:MySQL 5.7 及更早版本不支持 STDDEV 和 VARIANCE 作为聚合函数(仅支持 STDDEV_SAMP 等变体),若用旧版 MySQL,必须改用 STDDEV_SAMP() 或 VARIANCE_SAMP()。
STDDEV_SAMP vs STDDEV_POP 的区别与选型
这是最容易混淆的点——STDDEV 和 VARIANCE 在多数数据库中是 STDDEV_SAMP 和 VARIANCE_SAMP 的别名,即按「样本」公式计算(分母为 n−1)。如果你需要「总体」标准差(分母为 n),必须显式使用:
-
STDDEV_POP()或VAR_POP()(PostgreSQL/Oracle/SQL Server) -
STDDEV_POP()和VARIANCE_POP()(MySQL 8.0+)
例如:某部门有全部 5 名员工的薪资数据,你想描述该部门整体离散程度 → 用 STDDEV_POP;若这 5 人只是从全公司抽样,想推断公司整体波动 → 用 STDDEV_SAMP(即默认 STDDEV)。
NULL 值和空组如何影响结果
STDDEV 和 VARIANCE 会自动忽略 NULL 值,但要求每组至少有 2 个非 NULL 值才能返回有效数字。否则:
- 当组内非 NULL 值数量 STDDEV_SAMP 和
VARIANCE_SAMP返回NULL -
STDDEV_POP和VARIANCE_POP在仅 1 个非 NULL 值时返回 0(因方差定义为 0) - 整组全为
NULL或无记录 → 所有变体均返回NULL
实操建议:加 HAVING COUNT(col) > 1 过滤掉无效组,或用 COALESCE(STDDEV(col), 0) 避免空值干扰后续计算(但要注意语义是否合理)。
性能与索引注意事项
这些函数本身不触发索引优化,执行时仍需扫描全部分组数据。如果表很大且只查少数分组,先用 WHERE 缩小范围比依赖 GROUP BY 后过滤更高效。
示例:想看各城市订单金额的标准差,但只关心「近 30 天」的数据 —— 必须写成:
SELECT city, STDDEV(amount) FROM orders WHERE order_date >= CURRENT_DATE - INTERVAL '30 days' GROUP BY city;
而不是把 WHERE 放在 GROUP BY 之后。另外,STDDEV 无法利用普通 B-tree 索引加速,如需高频统计,可考虑物化视图(PostgreSQL)或汇总表预计算。
标准差计算隐含两遍扫描(先算均值,再算平方差),数据量极大时延迟明显,别在 OLTP 查询里直接嵌套多层 STDDEV。

















