MySQL:求众数、平均数、中位数

本文深入探讨了SQL中计算众数、平均数和中位数的多种方法,包括使用HAVING子句、视图和聚合函数等高级技巧,旨在帮助读者掌握更高效的数据分析技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.样例表

ceshi_salaries表中字段如下所示
在这里插入图片描述

2.众数

以求员工工资的众数为例

2.1使用having

首先用COUNT()对工资计数,找到出现最多的次数

SELECT COUNT(*) 
FROM ceshi_salaries 
GROUP BY salary

再用嵌套即可

SELECT salary,COUNT(*) AS cnt
FROM ceshi_salaries
GROUP BY salary
HAVING count(*) >= ALL(SELECT COUNT(*) FROM ceshi_salaries GROUP BY salary) 

补充ALL、IN和ANY的用法

  1. IN:在范围内的值,只要有就true;
  2. ALL:与子查询返回的所有值比较为true,则返回true;
  3. ANY:与子查询返回的任何值比较为true,只有有一个成立,则返回true;

2.2使用视图+max

create view max_a as -- 创建视图
SELECT salary,COUNT(*) as nt
FROM ceshi_salaries 
GROUP BY salary;
select salary,nt
from max_a
where nt=(select max(nt) from max_a)

3.平均数

3.1直接sum/count

SELECT SUM(salary)/COUNT(DISTINCT emp_no) AS avg_salary
FROM ceshi_salaries

3.2使用avg

SELECT AVG(a.salary)
FROM
	(SELECT SUM(salary) AS salary
	 FROM ceshi_salaries
	 GROUP BY emp_no) AS a

4.中位数

SELECT AVG(DISTINCT a.salary) AS median_salary
FROM
	(SELECT a.salary
	 FROM ceshi_salaries AS a, ceshi_salaries AS b
	 GROUP BY a.salary
	 HAVING SUM(CASE WHEN b.salary >= a.salary THEN 1 ELSE 0 END) >= COUNT(*) / 2 
	 AND SUM(CASE WHEN b.salary <= a.salary THEN 1 ELSE 0 END) >= COUNT(*) / 2 ) AS a;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值