[sql问题]查找出员工工资表中薪水第3高的员工记录。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[sql问题]查找出员工工资表中薪水第3高的员工记录。相关的知识,希望对你有一定的参考价值。

员工工资表:staff_payment
表中有:
(1)id int
(2)name varchar(10)
(3)payment money
实际情况是可能员工的工资有一样的记录。
不用rownum该怎么弄?

参考技术A /*select *
from staff_payment
where payment=(
select distinct payment
from staff_payment
order by payment desc
where rownum=3
)*/
不知道逻辑上有没有错误,我这里也试不了。
有错请指出,我也是菜鸟。

select * from staff_payment
where payment=(
select max(payment) from(
select distinct top 3 payment from staff_payment
order by payment)as temp)
测试通过!

思路:用distinct关键字去除重复记录.最内层语句选出工资排在前三名的记录,然后用max函数选出其最大值也就是第3高的工资。最外层语句则用工资匹配选出其所需第3高的员工记录。
在SQL2000中测试通过,如有问题请指出。
参考技术B select top 1 * from staff_payment where payment money in(select top 3 payment money from staff_payment order by payment money desc) 参考技术C select * from staff_payment order by payment desc where
rownum = 3

没试,自己试试看本回答被提问者采纳

牛客题霸-SQL篇——10~20题

+ SQ11:获取所有员工当前的manager

描述

有一个员工表dept_emp简况如下:
在这里插入图片描述

第一行表示为员工编号为10001的部门是d001部门。

有一个部门经理表dept_manager简况如下:
在这里插入图片描述

第一行表示为d001部门的经理是编号为10002的员工。

获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:
在这里插入图片描述

实例代码:

select d.emp_no,m.emp_no manager
from dept_emp d 
left join dept_manager m 
on d.dept_no = m.dept_no
where d.emp_no != m.emp_no

在这里插入图片描述

+ SQ12:获取每个部门中当前员工薪水最高的相关信息

描述

有一个员工表dept_emp简况如下:
在这里插入图片描述

有一个薪水表salaries简况如下:
在这里插入图片描述

获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下:
(注意: Mysql与Sqlite select 非聚合列的结果可能不一样)
在这里插入图片描述

代码:

select d.dept_no,s.emp_no,s.salary maxSalary
from dept_emp d 
left join salaries s 
on d.emp_no = s.emp_no

group by d.dept_no
having max(s.salary)
order by d.dept_no asc
 

在这里插入图片描述

+ SQ15:查找employees表

描述

有一个员工表employees简况如下:

在这里插入图片描述

建表语句如下:

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:
在这里插入图片描述

代码:

select d.dept_no,s.emp_no,s.salary maxSalary
from dept_emp d 
left join salaries s 
on d.emp_no = s.emp_no

group by d.dept_no
having max(s.salary)
order by d.dept_no asc
 

在这里插入图片描述

+ SQ16:统计出当前各个title类型对应的员工当前薪水对应的平均工资

描述

有一个员工职称表titles简况如下:
在这里插入图片描述

有一个薪水表salaries简况如下:
在这里插入图片描述

建表语句如下:

CREATE TABLE titles (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:
在这里插入图片描述

代码

select t.title,avg(s.salary)
from titles t 
left join salaries s 
on t.emp_no = s.emp_no
group by t.title
having avg(s.salary) 
order by avg(s.salary)  asc

在这里插入图片描述

+ SQ17:获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

描述

有一个薪水表salaries简况如下:

在这里插入图片描述

请你获取薪水第二多的员工的emp_no以及其对应的薪水salary
在这里插入图片描述

代码:

select emp_no,salary
from salaries s
order by s.salary desc
limit 1,1

在这里插入图片描述

+ SQ18:获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

描述

有一个员工表employees简况如下:
在这里插入图片描述

有一个薪水表salaries简况如下:
在这里插入图片描述

请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:

(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

在这里插入图片描述

示例1
输入:

drop table if exists  `employees` ; 
drop table if exists  `salaries` ; 
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');

输出:
10004|74057|Koblick|Chirstian

代码:

select salaries.emp_no, max(salary) salary ,last_name,first_name
from  employees
left join salaries
on employees.emp_no = salaries.emp_no
where salary not in(
    select max(e.salary)
    from salaries e
)

在这里插入图片描述

+ SQ19 查找所有员工的last_name和first_name以及对应的dept_name

描述

有一个员工表employees简况如下:
在这里插入图片描述

有一个部门表departments表简况如下:

在这里插入图片描述

有一个,部门员工关系表dept_emp简况如下:
在这里插入图片描述

请你查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工,以上例子输出如下:
在这里插入图片描述

代码:

select e.last_name,e.first_name,d.dept_name
from employees e
left join dept_emp de
on e.emp_no = de.emp_no
left join departments d
on de.dept_no = d.dept_no



在这里插入图片描述

以上是关于[sql问题]查找出员工工资表中薪水第3高的员工记录。的主要内容,如果未能解决你的问题,请参考以下文章

Sql 查询查找更高的薪水

牛客题霸-SQL篇——10~20题

统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg

sql查询员工的基本工资排名第3-6位的姓名和基本工资

获取员工其当前的薪水比其manager当前薪水还高的人

获取薪水第二高的员工姓名[重复]