牛客网11-20

题目11
求出员工以及经理的两列,以部门为纽带(on)
select e.emp_no,m.emp_no
from dept_emp e
inner join dept_manager m
on e.dept_no=m.dept_no
where e.emp_no <> m.emp_no
and e.to_date=‘9999-01-01’
and m.to_date=‘9999-01-01’;

12 筛选条件,当前部门当前员工以及以部门作为分类
select d.dept_no,d.emp_no,max(s.salary)
from dept_emp d
inner join salaries s
on d.emp_no = s.emp_no
where d.to_date=‘9999-01-01’ and s.to_date=‘9999-01-01’
group by dept_no;

最高薪水那边要加max(s.salary)

13
从个数中,count()表示个数
1.count() 该聚合函数用于计数
2.group by 用于分组,且需要写于判断条件having前
3. 由于 t 是聚合函数的别名, 因此该判断条件应当用having
select title,count(
) t
from titles
group by title
having t >= 2;

14
增加"注意对于重复的emp_no进行忽略(即emp_no重复的title不计算,title对应的数目t不增加)"这个条件,那么会用count (distinct emp_no)
1、先用GROUP BY title将表格以title分组,再用COUNT(DISTINCT
emp_no)可以统计同一title值且不包含重复emp_no值的记录条数

2、根据题意,输出每个title的个数为t,故用AS语句将COUNT(DISTINCT emp_no)的值转换为t

3、由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>=2的条件

select title, count(distinct emp_no) t
from titles
group by title
having t>=2;

15
查找employees表,当没有明确的时候,用*
e.emp_no % 2 = 1来表达emp_no为奇数
last_name is not 'Mary’来表达last_name不为Mary
order by hire_date desc来表达hire_date逆序排列
在电脑端 is not 识别不出,用<>
select *
from employees e
where e.emp_no % 2 = 1
and last_name is not ‘Mary’
order by hire_date desc;

16
各个title类型就清楚,我们要用group by
select t.title,avg(s.salary) avg
from titles t
inner join salaries s
on t.emp_no=s.emp_no
where t.to_date=‘9999-01-01’ and s.to_date=‘9999-01-01’
group by title;
增加知识点
Where” 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。

“Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

按照题目去查找
select s.emp_no,s.salary
from salaries s
where s.to_date=‘9999-01-01’
and salary = (
select distinct(salary)
from salaries s
order by salary desc
limit 1,1//这里说明一下就是拿第二高的薪水,可能第一的薪水多人拿
);

18
1、先利用MAX()函数找出salaries中当前薪水最高者,即SELECT MAX(salary) FROM salaries
WHERE to_date = ‘9999-01-01’

2、再利用INNER JOIN连接employees与salaries表,限定条件为【同一员工】e.emp_no =
s.emp_no、【当前】s.to_date = '9999-01-01’与【非薪水最高】s.salary NOT IN (SELECT
MAX(salary) FROM salaries WHERE to_date = ‘9999-01-01’)

3、在以上限制条件下找薪水最高者,即为所有员工薪水的次高者
查找最高薪max(s.salary),但又限定不是最高薪那边找,只能是次高薪
select e.emp_no,max(s.salary),e.last_name,e.first_name
from employees e
inner join salaries s
on e.emp_no=s.emp_no
where s.to_date=‘9999-01-01’
and salary not in(
select max(salary)
from salaries
where s.to_date=‘9999-01-01’
);

19
本题思路为运用两次LEFT JOIN连接嵌套

1、第一次LEFT
JOIN连接employees表与dept_emp表,得到所有员工的last_name和first_name以及对应的dept_no,也包括暂时没有分配部门的员工

2、第二次LEFT
JOIN连接上表与departments表,即连接dept_no与dept_name,得到所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

select last_name,first_name,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;

20
本题严谨的思路如下:

1、先分别找到emp_no=10001的员工的第一次工资记录与最后一次工资记录

2、再将最后一次工资记录减去第一次工资记录得到入职以来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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值