首页 > 试题广场 >

查找所有员工入职时候的薪水情况

[编程题]查找所有员工入职时候的薪水情况
  • 热度指数:346491 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
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`));

输入描述:


输出描述:
emp_no salary
10011 25828
省略 省略
10001 60117
示例1

输入

输出

单纯想想入职时薪水最低来考虑
select emp_no,min(salary) from salaries group by emp_no order by emp_no desc
编辑于 2018-04-04 21:07:45 回复(4)
select e.emp_no,s.salary from employees e 
left join salaries s on e.emp_no=s.emp_no 
and e.hire_date=s.from_date 
order by e.emp_no desc
这道题不难,薪水表中有员工的id,做关联查询,员工表中hire_date是入职的时间,
新水表中from_date也是员工入职的时间,这样做关联就可以了
还有一种查询:用内连接查询
select e.emp_no,s.salary from employees e ,salaries s 
where e.emp_no=s.emp_no 
and e.hire_date=s.from_date 
order by e.emp_no desc


发表于 2018-06-21 11:01:37 回复(1)
select e.emp_no,s.salary from salaries s left join employees e on e.emp_no=s.emp_no where e.hire_date=s.from_date order by e.emp_no desc;
发表于 2018-06-19 21:24:38 回复(2)
此题应注意以下四个知识点:
1、由于测试数据中,salaries.emp_no 不唯一(因为号码为 emp_no 的员***有多次涨薪的可能,所以在 salaries 中对应的记录不止一条),employees.emp_no 唯一,即 salaries 的数据会多于 employees,因此需先找到 employees.emp_no 在 salaries 表中对应的记录salaries.emp_no,则有限制条件 e.emp_no = s.emp_no
2、根据题意注意到 salaries.from_date 和 employees.hire_date 的值应该要相等,因此有限制条件 e.hire_date = s.from_date
3、根据题意要按照 emp_no 值逆序排列,因此最后要加上 ORDER BY e.emp_no DESC
4、为了代码良好的可读性,运用了 Alias 别名语句,将 employees 简化为 e,salaries 简化为s,即 employees AS e 与 salaries AS s,其中 AS 可以省略
方法一:利用 INNER JOIN 连接两张表
SELECT e.emp_no, s.salary FROM employees AS e INNER JOIN salaries AS s
ON e.emp_no = s.emp_no AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC
方法二:直接用逗号并列查询两张表
SELECT e.emp_no, s.salary FROM employees AS e, salaries AS s
WHERE e.emp_no = s.emp_no AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC

编辑于 2018-10-08 18:45:34 回复(84)
窗口函数即可,解法如下:
select emp_no,salary
from
(select 
emp_no,
salary,
row_number() over(partition by emp_no order by from_date) a
from salaries) t
where t.a=1
order by emp_no desc


编辑于 2021-01-27 10:36:21 回复(0)
select e.emp_no,s.salary from employees e
left join salaries s
on e.emp_no=s.emp_no
where e.hire_date = s.from_date
order by emp_no desc;
按照句意写出来即可
需要注意隐藏条件,起始日期一样
发表于 2021-01-13 16:10:02 回复(0)
select a.emp_no,a.salary from salaries a where a.from_date =
 (select min(b.from_date) from salaries b where b.emp_no = a.emp_no) order by a.emp_no desc;
发表于 2020-12-02 15:57:17 回复(0)
SELECT e.emp_no , s.salary
FROM employees e INNER JOIN salaries s 
ON e.emp_no = s.emp_no
AND e.hire_date = s.from_date
ORDER BY e.emp_no desc

第六题,这里要注意 e.hire_date = s.from_date
发表于 2020-11-27 15:50:17 回复(0)
SELECT emp_no, salary
FROM employees 
NATURAL JOIN (
    SELECT emp_no, salary, row_number() OVER(PARTITION by emp_no order by from_date) t1 FROM salaries
)
WHERE t1 = 1
ORDER BY emp_no DESC
发表于 2020-10-16 14:51:21 回复(0)
select emp_no, salary
from salaries s
group by s.emp_no
order by s.emp_no desc 
发表于 2020-10-15 08:54:10 回复(0)
  • 方法1:连接两表,因为薪水表的员工编号不唯一,所以限制条件:雇佣日期 = 薪水开始日期
    • select e.emp_no, s.salary from employees e inner join salaries s
    • on e.emp_no = s.emp_no
    • where e.hire_date = s.from_date
    • order by e.emp_no desc;
  • 方法2:只调用1表,先按照员工编号分组,再用having过滤出 最小开始日期的情况
    • select emp_no, salary from salaries
    • group by emp_no
    • having from_date = min(from_date)
    • order by emp_no desc;
     
发表于 2020-07-11 22:37:35 回复(1)
16ms  
1.   主要在工资表中筛选出该名员工入职时候的工资,所以
select salary , min(from_date), emp_no from salaries group by emp_no 
按照员工emp_no进行分组查,取出最小的from_date的这条记录
2. 用员工表按照emp_no 左连接即可

select e.emp_no ,tmp.salary from employees as e
left join (select salary , min(from_date), emp_no from salaries group by emp_no  )as  tmp  
on e.emp_no=tmp.emp_no
order by e.emp_no desc


发表于 2020-06-15 16:50:59 回复(0)
SELECT EM.emp_no,SA.salary 
FROM employees AS EM LEFT JOIN salaries AS SA
ON SA.from_date = EM.hire_date AND SA.emp_no = EM.emp_no
ORDER BY EM.emp_no DESC;

SELECT SA.emp_no, SA.salary
FROM
(SELECT MIN(from_date) AS great_day, emp_no
FROM salaries
GROUP BY emp_no) AS SS
INNER JOIN
salaries AS SA 
ON SS.emp_no = SA.emp_no AND SS.great_day = SA.from_date
ORDER BY SA.emp_no DESC;
根据题目描述,完全可以只用salaries一张表,并不需要从employees中获取hire_date信息。
实测上面两种写法均可,后一种为只用一张表的写法
发表于 2020-04-09 02:27:30 回复(1)
用子查询好像也可以
select emp_no,salary from salaries a
where from_date=(select min(from_date) from salaries b where a.emp_no=b.emp_no )
order by emp_no desc;
发表于 2020-03-11 15:40:20 回复(1)
那么也可以这样写吧
select emp_no,salary from salaries group by emp_no order by emp_no desc
线上是跑的通但是我的本地测试数据跑不通不知道为什么

发表于 2019-12-13 16:24:08 回复(0)
select s.emp_no,s.salary
from salaries as s left join employees as e
on e.emp_no=s.emp_no
where e.hire_date=(select min(hire_date)
                  from employees
                  group by emp_no)
order by s.emp_no desc

这个哪里错了,求解答
发表于 2019-08-28 20:09:56 回复(3)
SELECT e.emp_no,s.salary FROM employees e,salaries s
WHERE e.emp_no = s.emp_no 
AND s.from_date = e.hire_date
ORDER BY e.emp_no DESC; 

发表于 2019-08-07 17:59:22 回复(0)
// 查询两张表,按照emp_no 和 日期选择好,再按照要求排序
select a.emp_no as emp_no ,salary from salaries as a, employees as b
where a.emp_no= b.emp_no and a.from_date = b.hire_date order by emp_no desc;

发表于 2019-04-29 10:57:16 回复(0)
SELECT s.emp_no,s.salary
FROM salaries s INNER JOIN employees e
ON s.emp_no=e.emp_no AND s.from_date=e.hire_date
ORDER BY s.emp_no DESC

发表于 2019-04-01 15:45:07 回复(0)
注意是入职时的薪水

SELECT emp_no, salary FROM employees e NATURAL JOIN salaries s WHERE e.hire_date = s.from_date ORDER BY emp_no DESC;

发表于 2018-12-20 22:07:05 回复(1)