牛客网sql刷题记录

边写边更新。

SQL1.查找最晚入职的员工的所有信息

分析:题目直接告诉入职日期不是同一天,所以不用考虑重复等问题了。最晚入职的员工,我们可以先查找出最晚入职的员工的时间,然后hire_time等于这个时间就可以了。

答案:

select * from employees  where hire_date = (select MAX(hire_date) from employees);

SQL2.查找入职员工时间排名倒数第三的员工所有信息

分析:首先看到倒数第三,很自然想到的就是offset和limit,order by后进行offset,然后limit设置为1就可以啦。当然,倒数第三,注意排序顺序。

答案:

select * from employees order by hire_date desc limit 1 offset 2;

SQL3.查找各个部门当前领导当前薪水详情以及对应部门编号dept_no

分析:这个按照要求来就好了,主要涉及表的之间的连接。那个当前部门和当前领导一定要加上,不然算错……

答案:

select s.*,d.dept_no
from salaries s  inner join dept_manager  d
on s.emp_no=d.emp_no
where s.to_date='9999-01-01' and d.to_date='9999-01-01'

SQL4.查找所有已经分配部门的员工的last_name和first_name

分析:重点可以很快看出来,已经分配部门的员工,说明有些员工的部门应该是空,那么直接连接两张表然后筛选部门为空的就行了

select e.last_name,e.first_name,d.dept_no from dept_emp d,employees e where d.emp_no = e.emp_no and d.dept_no is not null;

 

SQL5.查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括暂时没有分配具体部门的员工.

分析:题目的重点是所有员工的,而且包括没有分配具体部门的员工,能提取出关键信息时主表应该是employees表,使用左连接,获取出dept_no即可。

答案:

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

SQL6.https://blog.csdn.net/zr1213159840/article/details/112605562

SQL7.查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

分许:就是计数然后筛序次数大于15的就可以了。这个问题还是值得深入探讨的,后面单独开一个博客。

答案:

select emp_no,count(*) t from salaries group by emp_no  having t > 15;

SQL8.找出所有员工当前具体的薪水salary情况

分析:相同的薪水只显示一次,我们需要使用distinct,当前的薪水,即to_date='9999-01-01'。还有逆序显示desc,组合下

答案:

select distinct salary from salaries  where to_date='9999-01-01'  order by salary desc;

SQL9.获取所有部门当前manager的当前薪水情况

分析:就是给出dept_no,emp_no以及salary并按照dept_no排序即可。

答案:

select  d.dept_no,d.emp_no,s.salary from salaries s,dept_manager d 
where d.emp_no = s.emp_no and d.to_date='9999-01-01' and  s.to_date='9999-01-01' order by d.dept_no asc;

SQL10.获取所有非manager的员工emp_no

分析:要求是非manager的员工,那么我们先筛选出事manager的emp_no然后排除这些就好了,涉及到子查询:先查询manager员工的emp_no然后not in即可

答案:

select emp_no from employees where emp_no not in (select emp_no from dept_manager);

SQL 11.获取所有员工的当前manager

已知有dept_emp表

部门经理dept_manager表

现在要查询获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示

分析:所有员工对应的经理,只需要将dept_emp表与dept_manager表进行左连接即可,同时要排除员工的本身是经理的情况,即dept_emp.emp_no <> dept_manager.emp_no,同时注意当时的含义,时间有限制

答案如下

select e.emp_no,m.emp_no from dept_emp e left join dept_manager m on e.dept_no = m.dept_no 
where  e.emp_no <> m.emp_no and e.to_date='9999-01-01' and m.to_date='9999-01-01';

SQL13.从titles表获取按照title进行分组

分析:按照title进行分组,很明显group by title。每组个数大于等于2,having >= 2,还需要数目count

答案:

select title,count(*) t from titles group by title having t>=2;

SQL15.找employees表所有的emp_no为奇数

分析:这个要求就是首先emp_no为奇数,那么直接emp_no%2 = 1即可,并且last_name不为Mary,即last_name <> Mary。还要逆序,desc

答案:

select * from employees where emp_no%2 = 1 and last_name not LIKE "%Mary%" order by hire_date desc;

SQL17.获取当前薪水第二多的员工的emp_no及其对应的薪水salary

分析:这个和前面的SQL2很像,不过加了表的之间的连接。加上即可

答案:

select emp_no,salary from salaries where to_date='9999-01-01' order by salary desc limit 1 offset 1;

SQL20.查找员工编号emp_now为10001其起入职以来薪水salary涨幅值growth。

分析:总共有这几个条件:emp_no=10001,薪水涨幅max(salary)-min(salary),这个地方没有降薪,所以这么写没毛病。

答案:

select max(salary) - min(salary) growth from salaries where emp_no = 10001;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值