牛客网数据库SQL实战解析(1-10题)

牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0

牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010666669/article/details/104763370

牛客网数据库SQL实战解析(11-20题): https://blog.csdn.net/u010666669/article/details/104863298

牛客网数据库SQL实战解析(21-30题): https://blog.csdn.net/u010666669/article/details/104871373

牛客网数据库SQL实战解析(31-40题): https://blog.csdn.net/u010666669/article/details/104977904

牛客网数据库SQL实战解析(41-50题): https://blog.csdn.net/u010666669/article/details/104979427

牛客网数据库SQL实战解析(51-61题): https://blog.csdn.net/u010666669/article/details/104980372

第1题 查找最晚入职员工的所有信息

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

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

select * 
from employees
where hire_date=(
    select distinct hire_date 
    from employees 
    order by hire_date desc 
    limit 2,1
)
;

limit语法:

limit 1,3 从1位置向后取3条记录。

limit 3 offset 1 等价于 limit 1,3。

 

第3题 查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号dept_no


select t1.emp_no
     , t1.salary
     , t1.from_date
     , t1.to_date
     , t2.dept_no
from salaries t1, dept_manager t2
where t1.to_date='9999-01-01'
and t2.to_date='9999-01-01'
and t1.emp_no=t2.emp_no
;

 

第4题 查找所有已经分配部门的员工的last_name和first_name以及dept_no

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

 

第5题 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

select t1.last_name
     , t1.first_name
     , t2.dept_no
from employees t1 
left join dept_emp t2
on t1.emp_no=t2.emp_no

 

第6题 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

select e.emp_no
     , s.salary
from salaries s 
left join employees e 
on s.emp_no=e.emp_no
where s.from_date=e.hire_date
order by e.emp_no desc
;

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

这道题目有问题,参考了提供的正确答案,把薪水变化都当成了涨幅,其实这样处理是有问题的,我按照题目的要求,重新写了下面的sql,虽然提交不通过,但是满足题意。

select t1.emp_no,count(*) t
from salaries t1 
inner join salaries t2 
on t1.emp_no=t2.emp_no 
and t1.to_date = t2.from_date
where t1.salary < t2.salary
group by t1.emp_no
having t > 15
;

题目的要点:

1. 薪资涨了,如果先降了薪资,后来又涨了,也算涨了

2. 按照员工分

3. 大于15次

 

第8题 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

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

题解:这道题很简单,按照要求取数,然后按照员工做group by,最后按照薪资做降序排列即可。

 

第9题 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'

select t1.dept_no
     , t1.emp_no
     , t2.salary
from dept_manager t1
left join salaries t2
on t1.emp_no=t2.emp_no
where t1.to_date='9999-01-01' and t2.to_date='9999-01-01'
;

 

第10题 获取所有非manager的员工emp_no

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

其他题解一:

mysql支持集合运算:EXPECT  集合差运算、UNION  集合并运算、INTERSECT 集合交运算

select emp_no
from employees
except
select emp_no
from dept_manager
;

其他题解二:

select t1.emp_no 
from employees t1
left join dept_manager t2
on t1.emp_no = t2.emp_no
where dept_no is null
;

 

posted @ 2020-03-09 22:32  水木青楓  阅读(123)  评论(0编辑  收藏  举报