文章目录
- 牛客网刷题思路解析
- 第1题 查找最晚入职员工的所有信息
- 第2题 查找入职员工时间排名倒数第三的员工所有信息
- 第3题 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
- 第4题 查找所有已经分配部门的员工的last_name和first_name
- 第5题 查找所有员工的last_name和first_name以及对应部门编号dept_no
- 第7题 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
- 第8题 找出所有员工当前具体的薪水salary情况
- 第10题 获取所有非manager的员工emp_no
- 第11题 获取所有员工当前的manager
- 第12题 获取所有部门中当前员工薪水最高的相关信息
- 第15题 查找employees表所有emp_no为奇数
- 第16题 统计出当前各个title类型对应的员工当前薪水对应的平均工资
- 第17题 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
- 第18题 查找当前薪水排名第二多的员工编号emp_no
- 第19题 查找所有员工的last_name和first_name以及对应的dept_name
- 第21题 查找所有员工自入职以来的薪水涨幅情况
牛客网刷题思路解析
第1题 查找最晚入职员工的所有信息
思路:查询所有的入职员工信息,根据时间进行降序排序desc,取第一个limit 1.
考点:date类型数据排序默认按照时间先后进行升序跑徐。
select
*
from
employees
order by hire_date desc
limit 1
第2题 查找入职员工时间排名倒数第三的员工所有信息
思路:1.先查询所有的入职员工信息,然后根据时间降序排序desc,取前三limit 3获得表t
2.从表t 中查询所有的信息,根据时间正序排序,取第一个limit 1
考点:desc:倒序排序 和 asc 升序排序
select
*
from
(
select *
from employees
order by hire_date desc
limit 3
)t
order by hire_date asc
limit 1
第3题 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
思路:领导表和薪水表 做内连接
查找信息
考点:内连接 join的使用方式 表1 join 表2 on 连接关系
select
s.emp_no,
s.salary,
s.from_date,
s.to_date,
m.dept_no
from salaries s
join dept_manager m on m.emp_no = s.emp_no
order by s.emp_no
第4题 查找所有已经分配部门的员工的last_name和first_name
思路:
1.员工表内连接部门表,
2.查询信息
考点:
未分配部门员工不显示,这句是重点,说明使用内连接
内连接是符合on条件的两个表中的记录进行合并,如果任意一个表不包括该字段,则不合并记录。
select
e.last_name,
e.first_name,
d.dept_no
from employees e
join dept_emp d on e.emp_no = d.emp_no
第5题 查找所有员工的last_name和first_name以及对应部门编号dept_no
思路:
1.员工表跟部门表做外连接
2.查询信息
select
e.last_name,
e.first_name,
d.dept_no
from employees e
left join dept_emp d
on e.emp_no = d.emp_no
第7题 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
思路:
按照emp_no group by,通过having查出来count()大于15的,输出emp_no和count()
考点:
1.聚合函数:对多个函数进行操作然后返回一个值 count()
2.where不能跟聚合函数,要跟就加个子查询
select
s.emp_no,
count(*) t
from salaries s
group by s.emp_no
having t>15
第8题 找出所有员工当前具体的薪水salary情况
考点: group by会根据字段进行聚合
思路1.distinct + order by desc
select
distinct s.salary
from salaries s
order by s.salary desc
思路2.group by salary + order by salary desc
select
s.salary
from salaries s
group by s.salary
order by s.salary desc
第10题 获取所有非manager的员工emp_no
思路:
1.员工表左外连接领导表
2.找出部门编号为null的字段
3.查询员工编号
考点:
left join保留左表记录(元组)的所有字段(属性),右表没有左表所对应的属性,保留右表的所有的属性为null
select
t1.emp_no
from
(
select
e.emp_no,
d.dept_no
from employees e
left join dept_manager d on e.emp_no = d.emp_no
)t1
where t1.dept_no is null
第11题 获取所有员工当前的manager
思路:
1.找出员工 员工表left join 经理表 根据任意一个字段is null
2.select出非经理岗位员工的emp_no dept_no
3.根据非经理岗位的员工的dept_no join 经理表的dept_no
4.select出该非经理员工的emp_no 以及 部门经理的emp_no
考点:
left join会产生为null的属性,该属性可以
select
t1.emp_no,
m.emp_no manager
from
(
select
e.emp_no,
e.dept_no
from dept_emp e
left join dept_manager m on e.emp_no = m.emp_no
where m.from_date is null
)t1
join dept_manager m on t1.dept_no = m.dept_no
第12题 获取所有部门中当前员工薪水最高的相关信息
思路:
按照部门group by组内对salary进行max(),部门间order by dept_no
考点:
group by 分组,通常和聚合函数一起使用,聚合函数=>多个输入一个输出 聚合函数在组内进行
一般用于一个集合数据中,和集合字段属性同时出现
select
t1.dept_no,
e.emp_no,
t1.m
from
(
select
e.dept_no,
max(s.salary) m
from dept_emp e
join salaries s on e.emp_no = s.emp_no
GROUP BY e.dept_no
)t1
join dept_emp e on t1.dept_no = e.dept_no
join salaries s on e.emp_no = s.emp_no
where t1.m = s.salary
order by t1.dept_no
第15题 查找employees表所有emp_no为奇数
思路:查找数据 用where 条件1 and 条件2 and······进行查询条件的拼接
考点:where 筛选条件用and拼接
select
*
from employees e
where e.emp_no%2 = 1
and e.last_name <> "Mary"
order by hire_date desc
第16题 统计出当前各个title类型对应的员工当前薪水对应的平均工资
思路:group by titiles表的title 组内进行avg(t.title) 最后查询
考点:连接表的时候要想好,假如存在没有titile的员工 对于没有titile的员工需不需要进行group by
select
t.title,
avg(s.salary) z
from salaries s
join titles t on s.emp_no = t.emp_no
group by t.title
order by z
第17题 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
思路:
考点:order by 和 limit 的配合使用 以及 order by的嵌套使用
select
*
from
(
select
s.emp_no,
s.salary
from salaries s
order by s.salary desc limit 2
)t1
order by t1.salary limit 1
第18题 查找当前薪水排名第二多的员工编号emp_no
思路:不能使用order by 所以要使用where的子查询嵌套max()进行查询
考点:where 的子查询格式 不适用group by的情况下使用聚合函数是对全体数据做聚合的
select
e.emp_no,
s.salary,
e.last_name,
e.first_name
from employees e
join salaries s on e.emp_no = s.emp_no
where s.salary =(select max(salary) from salaries where salary < (select max(salary) from salaries))
第19题 查找所有员工的last_name和first_name以及对应的dept_name
思路:三表联查,但是因为有员工没有部门,因此员工表和其他两个表 需要进行左连接
考点:左连接left join
select
e.last_name,
e.first_name,
de.dept_name
from employees e
left join dept_emp d on e.emp_no = d.emp_no
left join departments de on d.dept_no = de.dept_no
第21题 查找所有员工自入职以来的薪水涨幅情况
思路:
1.查询出在职员工的姓,名,雇佣时间,薪水表
2.查询出入职时间为雇佣时间的在职员工当时的薪水并与现在的薪水作差求出薪水增幅
考点:
如何把在职员工目前的薪水和入职时候的薪水做连接
select
ss.emp_no,
t1.salary - ss.salary growth
from
(
select
e.last_name,
e.first_name,
e.hire_date,
s.salary
from employees e
join salaries s on e.emp_no = s.emp_no
where s.to_date = "9999-01-01"
)t1
join salaries ss on t1.hire_date = ss.from_date
order by growth