查询一组数据的众数:
方法1:仅适用于一组数据只有一个众数的情况
1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数,再根据计数的大小进行降序排序;
2)上述1)中结果集的第一行即要求取的众数所在的行。
方法2:适用于一组数据有一个或多个众数的情况
1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数;
2)使用max函数找出统计个数的最大值及其对应的被统计值,此被统计值就是要求的众数。
创建测试用表:
# 创建学生成绩表:
create table grade(
id int,
name varchar(10),
score int (10)
)engine myisam charset utf8mb4;
# 向成绩表中插入数据:
insert into grade values
(1,'张无忌',85),
(2,'李隆基',59),
(3,'王五',60),
(4,'曹操',79),
(5,'小明',90),
(6,'如花',60),
(7,'尉迟恭',100),
(8,'欧阳风',90),
(9,'刘备',90),
(10,'董永',99),
(11,'冯钰',83),
(12,'孙殿英',82);
查询学生成绩表garde中分数的众数及其出现的次数:
先查看garde表的整体信息:
select * from garde
方法1代码及查询结果:
方法2代码及查询结果:
为简化SQL语句,将方法2中的第一步处理——对数据按照值的不同进行分组,并对每组中的数据进行计数写成视图:
create view grouped_grade as
select score,count(score) as number from grade group by score;
查看视图grouped_grade中的信息:
select score,number from grouped_grade;
使用max函数从视图grouped_grade中找到所有分数的众数及其出现的次数:
select score,number from grouped_grade where number=(select max(number) from grouped_grade);
查询结果为:
查询一组数据的中位数:
网上看到一个很巧妙的方法:
SET @rowindex := -1;
SELECT
AVG(g.score) AS median
FROM
(SELECT @rowindex:=@rowindex + 1 AS rowindex,
score
FROM grade
ORDER BY score) AS g
WHERE
g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));
代码解析:上述查询方法的核心思想是对于一组要求其中位数的数据,无论数据的总行数是奇数还是偶数,都取这组数据排序后最中间的两个数的平均值作为中位数(当数据的总行数是奇数时,数据经排序后最中间的数取两次以计算平均值)。
上述代码的查询结果为:
对grade表中的score按照升序进行排序,根据排序结果验证前文查询出的中位数是否正确:
经比较可知,前文查询出的中位数是正确的。