mysql查询之 第二高薪水,部门工资最高的员工,部门工资前三高的员工
(1)第二高薪水
编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary)
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
。
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
刚一看题目,觉得很简单的,可是做了一下之后才发现很多细节都没考虑,特此记录下来
select (select distinct Salary from Employee order by Salary desc limit 1,1)as SecondHighestSalary
或
select (select distinct Salary from Employee order by Salary desc limit 1 offset 1)as SecondHighestSalary
limit限制结果范围
SELECT * FROM Employee LIMIT 0,1; SELECT * FROM Employee LIMIT 1 OFFSET 0; SELECT * FROM products LIMIT 1;
“0”: 代表数据获取的起始位置.(0代表第一条记录,以此递增)
“1”: 期望获取的记录条数.
当获取的记录是从第一条开始则可以省略书写起始位置 “0”
(2)部门工资最高的员工
Employee
表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | +----+-------+--------+--------------+
Department
表包含公司所有部门的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | Sales | Henry | 80000 | +------------+----------+--------+
SELECT d. NAME AS Department,e. NAME AS Employee,e.Salary FROM Department d,Employee e
WHERE d.Id = e.DepartmentId AND (e.Salary, e.DepartmentId) IN (SELECT Max(Salary),DepartmentId FROM Employee GROUP BY DepartmentId)
(3)部门工资前三高的员工
Employee
表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | +----+-------+--------+--------------+
Department
表包含公司所有部门的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Randy | 85000 | | IT | Joe | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+
select d.Name as Department,e.Name Employee,e.Salary from Employee e,Department d where e.DepartmentId=d.Id and Salary>=IFNULL((select distinct e1.Salary from Employee as e1 where e.DepartmentId=e1.DepartmentId order by e1.Salary desc limit 2,1),0) order by DepartmentId,Salary desc;
说明:
IFNULL(expression_1,expression_2);
如果expression_1
不为NULL
,则IFNULL
函数返回expression_1
; 否则返回expression_2
的结果
相关文章
- Linux下MySQL服务的重启指令(linux重启mysql命令)
- 深入理解MySQL中的查询游标(mysql查询游标)
- 利用Mysql嵌套游标提升查询效率(mysql游标嵌套游标)
- MySQL查询:学习内置函数的使用(mysql查询函数)
- MySQL日志文件:定位探索之旅(mysql日志文件在哪)
- 同步MySQL服务器时间同步:确保不落伍(mysql服务器时间)
- MySQL数据表查询:探索更多可能(mysql数据表的查询)
- ?MySQL中字节与字符的区别(mysql字节字符)
- 阿里巴巴:MySQL数据库搭建新时代(阿里巴巴mysql)
- 优化优化MySQL数据库:索引的重要性(Mysql索引数据)
- 百度:MySQL开创数据库查询新时代(百度mysql)
- MySQL查询优化:从IN中获取更高性能(mysql查询优化in)
- MySQL 行差异: 简单分析(mysql行相减)
- MySQL 索引:优化查询效率的方法(mysql索引方法)
- MySQL复制:实现高可用的配置指南(mysql复制配置)
- MYSQL字段注释查询:如何查看MYSQL中的字段注释(mysql查看字段注释)
- 如何在 MySQL 中进行时间范围查询?(mysql时间范围查询)
- MySQL在64G内存中的表现(mysql 64g内存)
- MySQL数据库修改命令简介(mysql数据库修改命令)
- 25字中文文章标题MySQL中价格用什么数据类型存储(mysql中价格用什么)
- MySQL操作如何使用SQL窗口进行数据查询和修改(mysql 中sql窗口)
- MySQL 中 Print 使用方法详解(mysql 中print)
- 插入的记录C程序实现MySQL查询插入记录(c mysql读出)
- MySQL关联查询排序技巧分享(mysql两表关联排序)
- c语言编程API实现MySQL数据库连接(c api链接mysql)
- MySQL 3306端口开启技术新时代(3306 mysql)
- MySQL在Clause中的应用(clause中mysql)
- 使用MySQL让查询结果一行显示完整(mysql一行显示完)