千家信息网

mysql中分组获取前三条记录的方法

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍mysql中分组获取前三条记录的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!要求:编写一个SQL,获取部门工资前三高的员工。员工表和部门表结构:CREAT
千家信息网最后更新 2026年11月04日mysql中分组获取前三条记录的方法

这篇文章主要介绍mysql中分组获取前三条记录的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

要求:编写一个SQL,获取部门工资前三高的员工。

员工表和部门表结构:

CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`salary` decimal(10,2),
`department_id` int(11),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
员工表和部门表数据:

INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (1, 'Joe', 70000.00, 1);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (2, 'Henry', 80000.00, 2);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (3, 'Sam', 60000.00, 2);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (4, 'Max', 90000.00, 1);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (5, 'Janet', 69000.00, 1);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (6, 'Randy', 85000.00, 1);
INSERT INTO `employee`(`id`, `name`, `salary`, `department_id`) VALUES (7, 'Eva', 85000.00, 1);

INSERT INTO `department`(`id`, `name`) VALUES (1, 'IT');
INSERT INTO `department`(`id`, `name`) VALUES (2, 'Sales');
题库的答案:

SELECT
d.`name` AS '部门',
e.`name` AS '员工',
e.salary AS '工资'
FROM
employee e
JOIN department d ON d.id = e.department_id
WHERE
(
SELECT count(DISTINCT em.salary) FROM employee em WHERE em.salary > e.salary AND em.department_id = e.department_id
) < 3
ORDER BY e.department_id, e.salary DESC
输出结果如下:

部门 员工 工资
IT Max 90000
IT Randy 85000
IT Eva 85000
IT Joe 70000
Sales Henry 80000
Sales Sam 60000
首先来理解一下上面的 SQL,当 < 3 的条件改为 = 0 时,即子表中相同部门没有比主表工资高的员工,则取得工资最高的员工;当条件为 = 1 时,表示子表中相同部门里只有一个比主表工资高的员工,则取得工资第二高的员工;同理,条件 = 2 表示工资第三高的员工,所以工资前三高的员工的条件为 < 3。

通过结果可以看到,第二名员工和第三名员工工资相同,被当作并列第二,并不会排挤掉第三名。如果我们希望出现并列第二名时,第三名就变成第四名呢?可以把 count(DISTINCT em.salary) 改成 count(*)。

SELECT
d.`name` AS '部门',
e.`name` AS '员工',
e.salary AS '工资'
FROM
employee e
JOIN department d ON d.id = e.department_id
WHERE
(
SELECT count(*) FROM employee em WHERE em.salary > e.salary AND em.department_id = e.department_id
) < 3
ORDER BY e.department_id, e.salary DESC

输出结果:

部门 员工 工资
IT Max 90000
IT Randy 85000
IT Eva 85000
Sales Henry 80000
Sales Sam 60000
上面的写法中,当我们取前两名时,会得到 IT 部门的第一名和两个第二名的员工。如果我们希望去掉并列的情况,即就算工资相同也分为不同名次呢?那可以根据工资排序来增加多一个序号列,把 employee 表替换成下面这个子表:

SELECT (@i:=@i+1) AS rownum, es.* FROM employee es, (select @i:=0) ri ORDER BY es.salary
1
然后去查询每个部门工资前两名的员工,这里注意一下,两个子表变量名需要不一样:

SELECT
d.`name` AS '部门',
e.`name` AS '员工',
e.salary AS '工资'
FROM
(SELECT (@i:=@i+1) AS rownum, es.* FROM employee es, (select @i:=0) ri ORDER BY es.salary) e
JOIN department d ON d.id = e.department_id
WHERE
(
SELECT count(*) FROM (SELECT (@j:=@j+1) AS rownum, es.* FROM employee es, (select @j:=0) rj ORDER BY es.salary) em WHERE em.rownum > e.rownum AND em.department_id = e.department_id
) < 2
ORDER BY e.department_id, e.salary DESC
结果如下:

部门 员工 工资
IT Max 90000
IT Randy 85000
Sales Henry 80000
Sales Sam 60000

以上是"mysql中分组获取前三条记录的方法"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

员工 工资 部门 相同 条件 结果 三名 二名 方法 三条 分组 两个 内容 篇文章 面的 输出 不同 最高 个子 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技未来 互联网科技公司做什么 盛创互联网科技有限公司 无锡溥仪互联网科技有限公司 海南科技产业互联网平台 成都玖崟互联网科技有限公司乐商圈怎么样 互联网时代科技改变生活 受益于互联网科技的高速发展 成都铂石互联网科技做什么的 互联网科技革命什么开始 广州市恰铎互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 滨湖区互联网智能科技产品有哪些 江苏苏星互联网科技有限公司 浙南科技城互联网大厦招聘 广州有谷有贝互联网科技有限公司 互联网科技包装股 互联网科技大佬云集 安徽九吞吴互联网科技有限公司 前海云享互联网科技 手冲咖啡和咖啡机区别 上海挚品互联网科技有限公司 中国 科技 互联网 广州善班互联网科技 剑昆互联网络科技有限公司临桂 互联网经济与金融科技 科技互联网大厂 21世纪互联网科技成就 恒生科技互联网指数十大成分股 株洲百竞科技的互联网营销顾问
0