牛客SQL 全部题目 SQL195-SQL206 10套代码及解析(1)

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

select *
from employees
where hire_date in (
    select max(hire_date)
    from employees
)

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

  1. LIMIT m,n : 表示从第m+1条开始,取n条数据;
    LIMIT n : 表示从第0条开始,取n条数据,是limit(0,n)的缩写。
  2. 第三行是where hire_date= 而不是 where hire_date in。因为子查询里是去重后的hire_date,同一个日期只有一个,所以这里的hire_date只能等于他,不能被他包含。
  3. 题目说明排名倒数第三的员工可能有多个,所以也可以理解成题目是让我们求倒数第三天来的员工分别是哪几个。解题思路是:先用子查询找到倒数第三天,然后直接查询出倒数第三天入职的分别包括谁。
select *
from employees
where hire_date = (
    select distinct hire_date
    from employees
    group by hire_date
    order by hire_date desc
    limit 2,1
)

SQL197 查找当前薪水详情以及部门编号dept no

select emp_no,
salary,
from_date,
a.to_date,
dept_no
from salaries as a
join dept_manager as b using(emp_no)
order by a.emp_no

SQL198 查找所有已经分配部门的员工的last name和first name以及dept no

select 
last_name,
first_name,
dept_no
from employees
right join dept_emp using(emp_no)

SQL199 查找所有员工的last name和first name以及对应部门编号dept no

select 
last_name,
first_name,
dept_no
from employees
left join dept_emp using(emp_no)

SQL201 查找薪水记录超过15条的员工号emp no以及其对应的记录次数t

select emp_no,
count(salary) as t
from salaries
group by emp_no
having t>15

SQL202 找出所有员工当前薪水salary情况

select salary
from salaries
group by salary
order by salary desc

SQL204 获取所有非manager的员Temp no

select emp_no
from employees
left join dept_manager using(emp_no)
where dept_no is null

SQL205 获取所有员工当前的manager

select a.emp_no,
b.emp_no as manager
from dept_emp as a
join dept_manager as b on a.dept_no=b.dept_no
where a.emp_no != b.emp_no

SQL206 获取每个部门中当前员工薪水最高的相关信息

  1. 本题看似简单,但是如果像下面这种方式写的话,就很容易出现报错(only_full_group_by ) 。因为在SQL中,所有查询的字段,除了用到max这些函数的,都必须在后面的group by中出现。类似于本题,如果在group by中加了 emp_no,那么就得不到想要的答案,如果把emp_no在第一行中删掉,又不满足题目要求。想解决这个问题,可以参考下面2中的方法。
select dept_no,d.emp_no,max(s.salary) as salary
from dept_emp as d
join salaries as s on d.emp_no = s.emp_no
group by d.dept_no
  1. 首先查询得到2张表,一张表为员工薪资表 表a,一张表为每个部门最高员工薪资表 表b。然后通过表连接 on d.emp_no = s.emp_no 使这两张表结合,通过on a.salary = b.salary使薪资统一,即这两张表连接后的表的薪资为每个部门的最高员工薪资。最后,再通过一次查询得到每个部门中当前员工薪水最高的相关信息。
select a.dept_no, a.emp_no, b.salary
from
    (select d.dept_no, s.emp_no, s.salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no 
    ) as a
    join
    (select d.dept_no, max(s.salary) as salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no
     group by d.dept_no
    ) as b 
    on a.salary = b.salary and a.dept_no = b.dept_no
order by a.dept_no

猜你喜欢

转载自blog.csdn.net/qq118640594X/article/details/128014363