牛客SQL 全部题目 SQL209-SQL219 10套代码及解析(2)

SQL209 查找emplovees表emp no与last name的员工信息

  1. 本题的难点在于查找出奇数,可通过以下几种方法查询:
  2. WHERE emp_no % 2 = 1(也可以改成MOD(emp_no, 2)=1,但部分sql版本可能不支持后者)
  3. WHERE emp_no & 1 ( 查询偶数的一般方法:emp_no=(emp_no>>1)<<1 )
  4. 查询奇数的正则化方法:emp_no REGEXP ‘[13579]$ ’ ; 查询偶数的正则化方法:emp_no REGEXP ‘[02468]$’
select *
from employees
where last_name not like 'Mary' and emp_no % 2 =1
order by hire_date desc

SQL210 统计出当前各个title类型对应的员工当前薪水对应的平均工资

select
title,
round(avg(salary),4) as a
from titles
join salaries using(emp_no)
group by title
order by a

SQL211 获取当前薪水第二多的员工的emp no以及其对应的薪水salary

select emp_no,
salary
from salaries
where salary=(
    select salary
    from salaries
    order by salary desc
    limit 1,1
    )

SQL212 获取当前薪水第二多的员工的emp no以及其对应的薪水salary

  1. 题目要求不可以用order by 求出薪水第二高的员工的工资。首先通过一个子查询找到最高工资,然后再通过一个子查询找到小于这个子查询工资之外的最高工资,即可得到薪水第二高的员工的工资。
select s.emp_no, s.salary, e.last_name, e.first_name
from salaries as s 
join employees as e using(emp_no)
where s.salary =             
    (
    select max(salary)        
    from salaries
    where salary <    
        (
        select max(salary)  
        from salaries        
        )
    )
  1. 第二种方法是通过使表自连接的方式。首先查询得到2个表 S1 S2(如图一所示),然后设置条件,使表1中的薪水小于等于表二中的薪水(如图二所示)。最后通过去重统计表二中薪水的数量确认第二高的薪水是多少(因为是s2 大于等于 s1 ,s1 中有3 个薪水的指标,s2中那么大于等于最高薪水的有3 个,大于等于第二高薪水的就有2个,大于等于第三高薪水的就有1个,所以用 count(distinct s2.salary) = 2)

    在这里插入图片描述
select s.emp_no, s.salary, e.last_name, e.first_name
from salaries as s 
join employees as e using(emp_no)
where s.salary =
    (
    select s1.salary
    from salaries as s1 
    join salaries as s2  on s1.salary <= s2.salary
    group by s1.salary                   
    having count(distinct s2.salary) = 2
    )

SQL213 查找所有员工的last name和first name以及对应的dept name

  1. 因为要输出还没有分配部门的员工,所以不能inner join, 要用两次 left join
select 
last_name,
first_name,
dept_name
from 
employees
left join dept_emp using(emp_no)
left join departments using(dept_no)

SQL215 查找在职员工自入职以来的薪水涨幅情况SQL216 统计各个部门的工资记录数

  1. 首先,用一个子查询得出 入职时工资表 和 当前工资表两个表格,一个表示当前的工资,一个表示入职时的工资,然后再次查询做减法,就可以得到涨薪情况了。
select 
b.emp_no,
(b.salary-a.salary) as growth
from 
(select 
e.emp_no,
s.salary
from employees as e 
left join salaries  as s on e.emp_no=s.emp_no
and e.hire_date=s.from_date)as a -- 入职工资表
inner join 
(select 
e.emp_no,
s.salary
from employees as e 
left join salaries  as s on e.emp_no=s.emp_no
where s.to_date='9999-01-01')as b -- 现在工资表
on a.emp_no=b.emp_no
order by growth

SQL216 统计各个部门的工资记录数

select
dept_no,
dept_name,
count(salary) as sum
from departments
left join dept_emp using(dept_no)
left join salaries using(emp_no)
group by dept_no,dept_name
order by dept_no

SQL217 对所有员工的薪水按照salary降序进行1-N的排名

select 
emp_no,
salary,
dense_rank()over(order by salary desc) as t_rank
from
salaries
group by emp_no,salary
order by t_rank,emp_no 

SQL218 获取所有非manager员工当前的薪水情况

select
dept_no,
emp_no,
salary
from dept_emp
join salaries using(emp_no)
where emp_no not in (
    select emp_no
    from dept_manager
    )

SQL219 获取员工其当前的薪水比其manager当前薪水还高的相关信息

  1. 首先,查询得出两个表格,一个为员工工资信息表 表a , 一个为领导工资信息表 表b ,通过表连接(on a.dept_no=b.dept_no),使这两张表结合。最后,用where设置a.salary>b.salary的条件,再一次查询,就可以得到题目中的四个信息了
select
a.emp_no as emp_no,
b.emp_no as manager_no,
a.salary as emp_salary,
b.salary as manager_salary
from(
    select 
    emp_no,
    dept_no,
    salary
    from dept_emp
    join salaries using(emp_no)
    where emp_no not in
        (
        select emp_no
        from dept_manager
        )
    ) as a
join(
    select
    emp_no,
    dept_no,
    salary
    from dept_manager
    join salaries using(emp_no)
    ) as b
on a.dept_no=b.dept_no
where a.salary>b.salary

猜你喜欢

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