题目来源于牛客SQL题目
1.找出所有员工当前薪水情况
员工薪水表salaries如下所示:
emp_no | salary | from_date | to_date |
10001 | 72527 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 43311 | 2001-12-01 | 9999-01-01 |
需求:找出所有员工的salary情况,相同的薪水只显示一次,并按照逆序显示,
以上例子输出如下:
salary |
72527 |
43311 |
题目分析
员工薪资可能会有相同值,需要对数据进行去重排序操作,在本题目中group by操作与distinct操作均可,这里我们采用group by操作进行去重并进行降序操作
代码实现
select
salary
from
salaries
where
to_date = '9999-01-01'
group by salary
order by salary desc
2.查找当前薪水详情以及部门编号dept_no
有一个全部员工的薪水表salaries简况如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 43311 | 2001-12-01 | 9999-01-01 |
有一个各个部门的领导表dept_manager简况如下:
dept_no | emp_no | to_date |
d001 | 10001 | 9999-01-01 |
d002 | 10003 | 9999-01-01 |
需求:查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,
输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:
emp_no | salary | from_date | to_date | dept_no |
10001 | 88958 | 2002-06-22 | 9999-01-01 | d001 |
10003 | 43311 | 2001-12-01 | 9999-01-01 | d002 |
题目分析
输出表格中含有表格1与表格2的内容,可以选择将两个表格相连接,连接数据为上述需求dept_no,注意输出表格数据列顺序.
代码实现
select
s.*,
d.dept_no
from
salaries as s
inner join dept_manager as on s.emp_no=d.emp_no
where
s.to_date='9999-01-01'
and d.to_date='9999-01-01'
3.查找所有员工入职的薪水情况
这里有两张表分别是employees与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`));
输出表格如下:
emp_no | salary |
10011 | 25828 |
10001 | 60117 |
需求:查找所有员工入职的薪水状况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
题目分析
最终输出表所含信息与表employees和salaries信息, 这里不选用两表相连,要求查询员工入职薪水情况,所以salaries.from_date 和 employees.hire_date 的值相等,因此有限制条件 e.hire_date = s.from_date,一位员工的salar不只有一个值,这里限制 e.emp_no = s.emp_no.
代码实现
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