牛客网SQL思路解析1-21


牛客网刷题思路解析

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

思路:查询所有的入职员工信息,根据时间进行降序排序desc,取第一个limit 1.
考点:date类型数据排序默认按照时间先后进行升序跑徐。

select
*
from 
employees
order by hire_date desc
limit 1

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

思路:1.先查询所有的入职员工信息,然后根据时间降序排序desc,取前三limit 3获得表t
2.从表t 中查询所有的信息,根据时间正序排序,取第一个limit 1
考点:desc:倒序排序 和 asc 升序排序

select
*
from 
	(
	select * 
	from employees
	order by hire_date desc 
	limit 3
	)t
 order by hire_date asc 
 limit 1

第3题 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no

思路:领导表和薪水表 做内连接
查找信息
考点:内连接 join的使用方式 表1 join 表2 on 连接关系

select
s.emp_no,
s.salary,
s.from_date,
s.to_date,
m.dept_no
from salaries s 
join dept_manager m on m.emp_no = s.emp_no
order by s.emp_no

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

思路:
1.员工表内连接部门表,
2.查询信息
考点:
未分配部门员工不显示,这句是重点,说明使用内连接
内连接是符合on条件的两个表中的记录进行合并,如果任意一个表不包括该字段,则不合并记录。

select
e.last_name,
e.first_name,
d.dept_no
from employees e
join dept_emp d on e.emp_no = d.emp_no

第5题 查找所有员工的last_name和first_name以及对应部门编号dept_no

思路:
1.员工表跟部门表做外连接
2.查询信息

select
e.last_name,
e.first_name,
d.dept_no
from employees e 
left join dept_emp d 
on e.emp_no = d.emp_no

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

思路:
按照emp_no group by,通过having查出来count()大于15的,输出emp_no和count()
考点:
1.聚合函数:对多个函数进行操作然后返回一个值 count()
2.where不能跟聚合函数,要跟就加个子查询

select
s.emp_no,
count(*) t 
from salaries s 
group by s.emp_no
having t>15

第8题 找出所有员工当前具体的薪水salary情况

考点: group by会根据字段进行聚合
思路1.distinct + order by desc

select
distinct s.salary
from salaries s
order by s.salary desc 

思路2.group by salary + order by salary desc

select
s.salary
from salaries s
group by s.salary
order by s.salary desc 

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

思路:
1.员工表左外连接领导表
2.找出部门编号为null的字段
3.查询员工编号
考点:
left join保留左表记录(元组)的所有字段(属性),右表没有左表所对应的属性,保留右表的所有的属性为null

select
t1.emp_no
from 
(
	select
	e.emp_no,
	d.dept_no
	from employees e 
	left join dept_manager d on e.emp_no = d.emp_no 
)t1 
where t1.dept_no is null

第11题 获取所有员工当前的manager

思路:
1.找出员工 员工表left join 经理表 根据任意一个字段is null
2.select出非经理岗位员工的emp_no dept_no
3.根据非经理岗位的员工的dept_no join 经理表的dept_no
4.select出该非经理员工的emp_no 以及 部门经理的emp_no
考点:
left join会产生为null的属性,该属性可以

select
t1.emp_no,
m.emp_no manager
from 
(
	select
	e.emp_no,
	e.dept_no
	from dept_emp e 
	left join dept_manager m on e.emp_no = m.emp_no  
	where m.from_date is null
)t1
join dept_manager m on t1.dept_no = m.dept_no

第12题 获取所有部门中当前员工薪水最高的相关信息

思路:
按照部门group by组内对salary进行max(),部门间order by dept_no
考点:
group by 分组,通常和聚合函数一起使用,聚合函数=>多个输入一个输出 聚合函数在组内进行
一般用于一个集合数据中,和集合字段属性同时出现

select 
 t1.dept_no,
 e.emp_no,
 t1.m
from
		(
		select
    e.dept_no,
    max(s.salary) m
    from dept_emp e
    join salaries s on e.emp_no = s.emp_no
    GROUP BY e.dept_no
		)t1
join dept_emp e on t1.dept_no = e.dept_no
join salaries s on e.emp_no = s.emp_no
where t1.m = s.salary
order by t1.dept_no 

第15题 查找employees表所有emp_no为奇数

思路:查找数据 用where 条件1 and 条件2 and······进行查询条件的拼接
考点:where 筛选条件用and拼接

select 
*
from employees e
where e.emp_no%2 = 1
and e.last_name <> "Mary"
order by hire_date desc

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

思路:group by titiles表的title 组内进行avg(t.title) 最后查询
考点:连接表的时候要想好,假如存在没有titile的员工 对于没有titile的员工需不需要进行group by

select
t.title,
avg(s.salary) z
from salaries s
join titles t on s.emp_no = t.emp_no 
group by t.title
order by  z

第17题 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

思路:
考点:order by 和 limit 的配合使用 以及 order by的嵌套使用

select
*
from
(
	select
	s.emp_no,
	s.salary
	from salaries s 
	order by s.salary desc limit 2 
)t1
order by t1.salary limit 1

第18题 查找当前薪水排名第二多的员工编号emp_no

思路:不能使用order by 所以要使用where的子查询嵌套max()进行查询
考点:where 的子查询格式 不适用group by的情况下使用聚合函数是对全体数据做聚合的

select 
e.emp_no,
s.salary,
e.last_name,
e.first_name
from employees e 
join salaries s on e.emp_no = s.emp_no
where s.salary =(select max(salary) from salaries where salary < (select max(salary) from salaries))

第19题 查找所有员工的last_name和first_name以及对应的dept_name

思路:三表联查,但是因为有员工没有部门,因此员工表和其他两个表 需要进行左连接
考点:左连接left join

select 
e.last_name,
e.first_name,
de.dept_name
from employees e 
left join dept_emp d on e.emp_no = d.emp_no
left join departments de on d.dept_no = de.dept_no

第21题 查找所有员工自入职以来的薪水涨幅情况

思路:
1.查询出在职员工的姓,名,雇佣时间,薪水表
2.查询出入职时间为雇佣时间的在职员工当时的薪水并与现在的薪水作差求出薪水增幅
考点:
如何把在职员工目前的薪水和入职时候的薪水做连接

select 
ss.emp_no,
t1.salary - ss.salary growth
from 
(
    select 
    e.last_name,
    e.first_name,
    e.hire_date,
    s.salary
    from employees e
    join salaries s on e.emp_no = s.emp_no
    where s.to_date = "9999-01-01"
)t1
join salaries ss on t1.hire_date = ss.from_date
order by growth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值