#数据库SQL实战#【Day5】

--------------------------------------------------
学习用,欢迎讨论。
--------------------------------------------------
查看详细题目的方法:
复制以下题目内容;
Ctrl+F查找刚刚复制的题目即可。
--------------------------------------------------
题目17:获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
select emp_no, salary from salaries
where to_date = '9999-01-01'
order by salary desc
limit 1, 1
上面是最直接的想法,但是没有考虑到员工工资相同的情况。进而有如下想法:
select emp_no, salary from salaries
where to_date = '9999-01-01'
and salary = (
select salary from salaries
where to_date = '9999-01-01'
group by salary
order by salary desc
limit 1, 1 )
通过子查询选出排在第二的工资,然后查找是这一工资的员工。
--------------------------------------------------
题目18:查找当前薪水排名第二多的员工编号emp_no
本题和题目17类似,但是题目要求不能使用order by,思路如下:
select e.emp_no, max(s.salary), e.last_name, e.first_name
from employees as e inner join salaries as s
on e.emp_no = s.emp_no
where s.to_date = '9999-01-01'
and s.salary < (select max(salary) from salaries where to_date = '9999-01-01')
同样,这样的思路没有考虑到员工工资相同的情况,和题目17类似,也有如下思路:
select e.emp_no, s.salary, e.last_name, e.first_name
from employees as e inner join salaries as s
on e.emp_no = s.emp_no
where s.to_date = '9999-01-01'
and s.salary = 
(
    select max(salary) from salaries 
    where to_date = '9999-01-01'
    and salary < 
    (
        select max(salary) from salaries
        where to_date = '9999-01-01'
    )
)
--------------------------------------------------
题目19:查找所有员工的last_name和first_name以及对应的dept_name
select e.last_name, e.first_name, d.dept_name
from employees as e
left join dept_emp as de on e.emp_no = de.emp_no
left join departments as d on de.dept_no = d.dept_no
直接两次使用left join即可得到结果。
--------------------------------------------------
题目20:查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
本题的关键在于对“自入职以来的薪水salary涨幅值”的定义,定义不同可以有不同的结果。
其一,涨幅值就是现在的薪水减去刚刚入职时候的薪水
select (
(select salary from salaries where emp_no = 10001 order by from_date desc limit 1)-
(select salary from salaries where emp_no = 10001 order by from_date limit 1)
) as growth
其二,涨幅值就是最大薪水减去最小薪水
select max(salary) - min(salary) as growth
from salaries where emp_no = 10001
以上都能通过测试,是因为数据比较特殊。当然,对于涨幅值也能有其他的理解。
--------------------------------------------------
全部评论
dd
点赞 回复 分享
发布于 2018-09-25 00:23

相关推荐

put添加元素的流程1&nbsp;首先会去借助哈希值计算桶索引的值,运算函数为(n-1)&amp;hash值进行与计算。:计算哈希值,jdk7之前是直接引用哈希值计算,而jdk8开始则借助哈希扰动的算法,原理呢就是将原哈希值向右移动16位,异或运算哈希值,将高位哈希值与地位哈希值都可以很好的参与到计算当中,减少哈希冲突的概率2&nbsp;判断该桶索引位置是否为空,如果为空直接进行存放Node节点。如果不为空,需要遍历链表或者红黑树,去判断是否存在相同的key,如果不同则插入,相同则覆盖。:8开始为尾插,8之前为头插(多线程扩容可能会导致链表出现死循环的问题)插入新节点后3对数组的元素进行计数,当数组当中的元素数量大于负载因子与容量的乘积时,会触发扩容机制,两倍的扩容速度,扩容过程当中存在对元素桶索引的重新分配问题:在jdk7之前会使用(2n-1)&amp;hash重新算一遍桶索引的位置(n为原数组长度):但是在jdk8开始,将(2n-1)&amp;hash进行拆分,拆成(n-1)&amp;hash+n&amp;hash=原索引位置+n&amp;hash,在判断过程当中呢,实现对n&amp;hash的计算即可,判断计算是否为零,为零则保留原索引,不为零则在原索引的基础之上加上旧数组长度,接着移动就简单了,将原先的链表拆分为两个临时链表,后续直接一次性挂载即可。4判断是否需要树化,先判断链表长度,在链表长度达到8的条件下,判断数组长度是否达到64,达到就将链表树化,没达到64就以2倍的速度进行扩容。
如果再来一次,你还会选择...
点赞 评论 收藏
分享
评论
点赞
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务