牛客SQL刷题(持续更新)

牛客SQL题目

题目链接:https://www.nowcoder.com/ta/sql

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

    select * 
    from 
    employees
    where 
    hire_date = (select max(hire_date) from employees);
  2. 查找入职员工时间排名倒数第3的员工所有信息

    select * 
    from 
    employees 
    order by 
    hire_date 
    desc --降序
    limit 2,1;--从3项,偏移1项,即第3项
  3. 查找各个部门当前(to_date='9999-01-01')的领导的当前薪水详情以及其对应部门编号dept_no

    select s.*,d.dept_no
    from salaries as s
    join dept_manager as d
    on d.emp_no=s.emp_no
    where s.to_date='9999-01-01'
    and d.to_date='9999-01-01';
  4. 查找所有已经分配部门的员工的last_name和first_name

    select e.last_name,e.first_name,d.dept_no
    from employees as e
    join dept_emp as d
    on e.emp_no = d.emp_no;
  5. 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

    select e.last_name,e.first_name,d.dept_no
    from employees as e
    left join dept_emp as d--坐表为主,右表补充,为空补NULL
    on e.emp_no = d.emp_no;
  6. 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

    select e.emp_no,s.salary
    from salaries as s
    join employees as e
    where e.emp_no = s.emp_no
    and e.hire_date = s.from_date
    order by
    e.emp_no
    desc;
  7. 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

    count( ):统计记录的条数

    还需要group by emp_no将每个员工的记录显示在一条记录中

    select emp_no,count(emp_no) as t
    from salaries
    group by
    emp_no
    having t > 15;
  8. 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

    distinct:去除重复

    select distinct salary-- 去除重复
    from salaries
    where to_date = '9999-01-01'
    order by
    salary
    desc;
  9. 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'

    select d.dept_no,d.emp_no,s.salary
    from dept_manager as d
    join salaries as s
    on d.emp_no=s.emp_no
    where d.to_date='9999-01-01'
    and s.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);
  11. 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。

    select e.emp_no,m.emp_no as manager_no
    from dept_emp as e
    join dept_manager as m
    on e.dept_no=m.dept_no
    where e.emp_no <> m.emp_no -- 当前manager是自己不显示,<>不等于
    and e.to_date='9999-01-01'
    and m.to_date='9999-01-01';
  12. 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

    select d.dept_no,d.emp_no,max(s.salary)
    from dept_emp as d
    join salaries as s
    on d.emp_no = s.emp_no
    group by
    d.dept_no;
  13. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。

    select title,count(title) as t
    from titles
    group by
    title
    having t >= 2;
  14. 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

    select * from employees
    where emp_no%2 =1
    and last_name <> 'Mary'
    order by
    hire_date
    desc;
  15. 统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。

    select t.title,avg(s.salary)
    from titles as t
    join salaries as s
    on t.emp_no = s.emp_no
    where s.to_date='9999-01-01'
    and t.to_date='9999-01-01'
    group by
    t.title;
  16. 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary

    select emp_no,salary from salaries
    where to_date='9999-01-01'
    order by
    salary
    desc
    limit 1,1;  -- 降序,取第二个
  17. 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by

    select e.emp_no,s.salary,e.last_name,e.first_name
    from employees as e
    join salaries as s
    on e.emp_no=s.emp_no
    where s.to_date='9999-01-01'
    order by
    s.salary
    desc
    limit 1,1;

    不使用order by:需要用嵌套select和max结合

    select e.emp_no,max(salary) ,e.last_name,e.first_name --这里用max(salary)
    from  salaries as s,employees as e
    where s.emp_no = e.emp_no
    and salary<  -- 小于最大薪水中的最大,就是第二大
    (
    select max(salary)
    from salaries
    where to_date = '9999-01-01'
    );
  18. 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

    双左连接

    select e.last_name,e.first_name,de.dept_name
    from employees as e
    left join dept_emp as d
    on e.emp_no=d.emp_no
    left join departments as de
    on d.dept_no=de.dept_no;
  19. 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

    通过入职时间来排序查询:

    如果直接用薪水最大值-最小值,有可能最后一次是降薪。

    SELECT ( 
    (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1) -
    (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date ASC LIMIT 1)
    ) AS growth
  20. 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

    --将两个查询的结果,当成两个表,进行join
    select S2.emp_no, (S2.salary-S1.salary) as growth
    from 
    (select e.emp_no,s.salary 
     from employees as e 
     join salaries as s 
     on e.emp_no=s.emp_no 
     and e.hire_date=s.from_date) as S1  --所有员工的入职工资
    join 
    (select e.emp_no,s.salary 
     from employees as e 
     join salaries as s 
     on e.emp_no=s.emp_no 
     and s.to_date='9999-01-01') as S2   --所有员工的当前工资
    on S1.emp_no = S2.emp_no
    order by growth;
  21.  

猜你喜欢

转载自www.cnblogs.com/mussessein/p/11627027.html