#数据库SQL实战#【Day2】

--------------------------------------------------
学习用,欢迎讨论。
--------------------------------------------------
查看详细题目的方法:
复制以下题目内容;
Ctrl+F查找刚刚复制的题目即可。
--------------------------------------------------
题目5:查找所有员工的last_name和first_name以及对应部门编号dept_no(也包括展示没有分配具体部门的员工)
select e.last_name, e.first_name, de.dept_no
from employees as e left join dept_emp as de
on e.emp_no = de.emp_no
题中要求展示没有分配具体部门的员工,考虑到使用的是SQLite,因此只能使用左连接。左连接会读取左边表的所有数据,即使右边的表无对应数据。
--------------------------------------------------
题目6:查找所有员工入职时候的薪水情况
select e.emp_no, s.salary
from employees as e inner join salaries as s
on e.emp_no = s.emp_no
where e.hire_date = s.from_date
order by e.emp_no desc
按照题目给出emp_no和salary,并按照emp_no逆序排列。由于题目给出了两个表,所以第一想法就是如上连接两个表。salaries表中from_date字段等于employees表hire_date字段时,就是入职时候的薪水。
但是,另一方面,完全可以只通过salaries表就完成查找。想法是:对每个员工的记录按照from_date进行升序排序,第一个就是入职时的薪水。
select emp_no, salary
from salaries as s
where from_date = (
select min(from_date) from salaries where emp_no = s.emp_no)
order by s.emp_no desc
当然“只通过salaries表进行查找”还有很多实现方法,可参见 [http://www.cnblogs.com/netserver/p/4518995.html]
--------------------------------------------------
题目7: 查找薪水涨幅超过15次的员工号emp_no以及对应的涨幅次数t
select emp_no, count(emp_no) as t
from salaries
group by emp_no
having t > 15
本题通过group by按照emp_no进行分组,通过count函数统计每组记录的个数,同时通过having筛选出涨幅次数超过15次的员工。
对于“涨幅”定义,题目没有说明。实际上应该是count(emp_no)-1。但是这样不能通过测试。
--------------------------------------------------
题目8:找出所有员工当前具体的薪水salary情况
select distinct salary from salaries
where to_date = '9999-01-01'
order by salary desc
本题的直接思路就是使用distinct关键字进行去重,得到上述语句。
但是很多人在讨论distinct和group by的效率问题,提出用group by去重更能提高效率,有如下解法:
select salary from salaries
where to_date = '9999-01-01'
group by salary
order by salary desc
在数据量小的时候,是感觉不出其中的差别的。数据量很大的时候,已有博客进行了讨论:https://www.jianshu.com/p/34800d06f63d
--------------------------------------------------
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务