#数据库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,因此只能使用左连接。左连接会读取左边表的所有数据,即使右边的表无对应数据。
key word: left join [http://www.runoob.com/sqlite/sqlite-joins.html]
--------------------------------------------------
题目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。但是这样不能通过测试。
key word: count [http://www.runoob.com/sqlite/sqlite-functions.html], group by [http://www.runoob.com/sqlite/sqlite-group-by.html], having [http://www.runoob.com/sqlite/sqlite-having-clause.html]
--------------------------------------------------
题目8:找出所有员工当前具体的薪水salary情况
select distinct salary from salaries where to_date = '9999-01-01' order by salary desc
本题的直接思路就是使用distinct关键字进行去重,得到上述语句。
key word: diatinct [http://www.runoob.com/sqlite/sqlite-distinct-keyword.html]
但是很多人在讨论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
--------------------------------------------------