【SQL实战(三)】【牛客网sql实战】

上一篇:【SQL实战(二)】【牛客网sql实战】

+++++++++++++开始线++++++++++++++++

一、 题目篇

1.1 第十六题

题目描述

查找当前薪水(to_date=‘9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不可使用order by

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`));

答案

select s.emp_no, s.salary, e.last_name, e.first_name
from salaries s join employees e
on s.emp_no = e.emp_no
where s.salary = 
(select max(salary)  from salaries where salary <  
(select max(salary)  from salaries where to_date = '9999-01-01'  )  
and to_date = '9999-01-01')
and s.to_date = '9999-01-01'

1.2 第十七题

题目描述

查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

CREATE TABLE `departments` (
 `dept_no` char(4) NOT NULL,
 `dept_name` varchar(40) NOT NULL,
 PRIMARY KEY (`dept_no`));
 
 CREATE TABLE `dept_emp` (
 `emp_no` int(11) NOT NULL,
 `dept_no` char(4) NOT NULL,
 `from_date` date NOT NULL,
 `to_date` date NOT NULL,
 PRIMARY KEY (`emp_no`,`dept_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`)); 

答案
思路:列出employees表里所有员工last_name, first_name, 根据employees中emp_no对应dept_emp中的dept_no,没有分配的员工找不到对应–>采用LEFT JOIN 再根据dept_no对应departments表中的dept_name,没有分配的员工找不到对应–>采用LEFT JOIN

SELECT last_name, first_name, dept_name
FROM employees AS e LEFT JOIN (SELECT emp_no, dept_name
FROM dept_emp AS de LEFT JOIN departments AS d
ON de.dept_no = d.dept_no) k
ON e.emp_no = k.emp_no;

1.3 第十八题

题目描述

查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth(可能有多次涨薪,没有降薪)

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`));

答案

select (select max(s1.salary) from salaries s1 where s1.emp_no=10001) -
(select min(s2.salary) from salaries s2 where s2.emp_no=10001) as growth

1.4 第十九题

题目描述

查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序 (注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面)

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`));

答案

select a.emp_no, (b.salary - c.salary) as growth 
from employees as a
inner join salaries as b
on a.emp_no = b.emp_no and b.to_date = '9999-01-01'
inner join salaries as c
on a.emp_no = c.emp_no and a.hire_date = c.from_date 
order by growth asc

1.5 第二十题

题目描述

统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum

CREATE TABLE `departments` (
 `dept_no` char(4) NOT NULL,
 `dept_name` varchar(40) NOT NULL,
 PRIMARY KEY (`dept_no`));
 
 CREATE TABLE `dept_emp` (
 `emp_no` int(11) NOT NULL,
 `dept_no` char(4) NOT NULL,
 `from_date` date NOT NULL,
 `to_date` date NOT NULL,
 PRIMARY KEY (`emp_no`,`dept_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`));

答案

SELECT dept_no, dept_name, (SELECT COUNT()
FROM dept_emp AS de
INNER JOIN salaries AS s
ON de.emp_no=s.emp_no
WHERE de.dept_no=d.dept_no) AS sum
FROM departments AS d;

+++++++++++++结束线++++++++++++++++

下一篇:【SQL实战(四)】【牛客网sql实战】

猜你喜欢

转载自blog.csdn.net/qq_42893334/article/details/107811304
今日推荐