Skip to content

MySQL - 标准差

标准差(Standard Deviation)是一种统计量,用于衡量一组数据值的分散程度或离散程度。低标准差表示这些值趋向于接近数据集的平均值(或期望值),而高标准差则表示这些值分布在一个更宽的范围内。

MySQL 提供了几个聚合函数,可以直接在查询中计算标准差。

在使用这些函数之前,理解总体(Population)和样本(Sample)之间的区别至关重要:

  • 总体: 指您正在研究的群体中的每个成员。例如,如果您有一个包含公司所有员工的表格,那么这就是总体。
  • 样本: 是一个更大总体的更小、可管理子集。例如,如果您调查 100 名随机员工来估计整个公司的满意度,那么这 100 人的群体就是一个样本。

它们的计算公式略有不同,MySQL 为每种情况都提供了单独的函数。

  • 总体标准差: - STDDEV_POP(expression): 这是标准的、明确的函数,推荐使用以保持清晰性。 - STD(expression): STDDEV_POP() 的同义词。 - STDDEV(expression): STDDEV_POP() 的另一个同义词,为与其他数据库系统兼容而提供。
  • 样本标准差: - STDDEV_SAMP(expression): 这是用于计算样本标准差的函数。

如果查询没有返回行,或者表达式对所有行都求值为 NULL,这些函数将返回 NULL。

让我们使用 employees 表,假设这些数据代表一家小公司的全体员工总体。

-- 如果您需要创建表:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
department VARCHAR(50) NOT NULL,
salary DECIMAL(10, 2) NOT NULL
);
INSERT INTO employees (department, salary) VALUES
('Engineering', 95000.00), ('Engineering', 110000.00),
('Sales', 72000.00), ('Sales', 68000.00),
('HR', 65000.00), ('Engineering', 125000.00),
('Sales', 88000.00);

为了找出公司薪资的整体离散度,我们使用 STDDEV_POP()。

SELECT STDDEV_POP(salary) AS salary_std_dev FROM employees;
salary_std_dev
20387.56417387

如果我们将数据视为一个更大组织的样本,我们将使用 STDDEV_SAMP()。请注意,结果略大。

SELECT STDDEV_SAMP(salary) AS salary_sample_std_dev FROM employees;
salary_sample_std_dev
21984.87103738

一个更强大的用法是比较每个部门内部的薪资变动。

SELECT
department,
AVG(salary) AS average_salary,
STDDEV_POP(salary) AS salary_std_dev
FROM
employees
GROUP BY
department;

这个查询揭示了工程部门的平均薪资更高,但薪资变动也比销售部门大得多。

departmentaverage_salarysalary_std_dev
Engineering110000.0012472.19128925
Sales76000.008944.27191
HR65000.000.0

自 MySQL 8.0 起,您可以将标准差函数用作窗口函数。这允许您在不使用 GROUP BY 折叠行的情况下,将偏差显示在每行数据旁边。

例如,让我们显示每个员工的薪资以及他们所在整个部门的标准差。

SELECT
id,
department,
salary,
STDDEV_POP(salary) OVER (PARTITION BY department) AS department_salary_std_dev
FROM
employees;

OVER (PARTITION BY department) 子句告诉 MySQL 为具有相同 department 值的每组行计算标准差。

iddepartmentsalarydepartment_salary_std_dev
1Engineering95000.0012472.19128925
2Engineering110000.0012472.19128925
6Engineering125000.0012472.19128925
5HR65000.000.0
3Sales72000.008944.27191
4Sales68000.008944.27191
7Sales88000.008944.27191

这种方法对于直接从数据库创建详细分析报告非常强大。