SQL209 查找emplovees表emp no与last name的员工信息
- 本题的难点在于查找出奇数,可通过以下几种方法查询:
- WHERE emp_no % 2 = 1(也可以改成MOD(emp_no, 2)=1,但部分sql版本可能不支持后者)
- WHERE emp_no & 1 ( 查询偶数的一般方法:emp_no=(emp_no>>1)<<1 )
- 查询奇数的正则化方法: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
- 题目要求不可以用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
)
)
- 第二种方法是通过使表自连接的方式。首先查询得到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
- 因为要输出还没有分配部门的员工,所以不能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 统计各个部门的工资记录数
- 首先,用一个子查询得出 入职时工资表 和 当前工资表两个表格,一个表示当前的工资,一个表示入职时的工资,然后再次查询做减法,就可以得到涨薪情况了。
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当前薪水还高的相关信息
- 首先,查询得出两个表格,一个为员工工资信息表 表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