#数据库SQL实战#【Day1】
--------------------------------------------------
学习用,欢迎讨论。
--------------------------------------------------
查看详细题目的方法:
复制以下题目内容;
Ctrl+F查找刚刚复制的题目即可。
--------------------------------------------------
题目1:查找最晚入职员工的所有信息
select * from employees order by hire_date desc limit 0,1
字面意思按照hire_date进行降序排列,用limit选择第一个员工。
key word: order by [http://www.runoob.com/sqlite/sqlite-order-by.html], limit [http://www.runoob.com/sqlite/sqlite-limit-clause.html]
但是表中的入职时间精确到日期,可能存在很多同一天入职的员工,那么“最晚入职”就没有一个准确的定义,所以有如下语句:
select * from employees where hire_date = (select max(hire_date) from employees)
我认为第一个语句符合题意,第二个语句符合表中字段的特点。两个都能通过测试
key word: where [http://www.runoob.com/sqlite/sqlite-where-clause.html]
--------------------------------------------------
题目2:查找入职员工时间排名倒数第三的员工所有信息
select * from employees order by hire_date desc limit 2,1
同题目1,这是符合字面意思的写法
看到很多人提到如下语句
select * from employees where hire_date = (select hire_date from employees order by hire_date desc limit 2,1)
选出了和按照hire_date降序排列排在第三的员工同一天入职的所有员工。
--------------------------------------------------
题目3:查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
select s.emp_no, s.salary, s.from_date, s.to_date, dm.dept_no from salaries as s inner join dept_manager as dm on s.emp_no = dm.emp_no where s.to_date='9999-01-01' and dm.to_date='9999-01-01'
key word: inner join [http://www.runoob.com/sqlite/sqlite-joins.html]
本题按照题意选择的主表是salaries,如果按照如下语句,主表选择dept_manager将会提示不通过【为什么呢?】
select dm.emp_no, s.salary, s.from_date, dm.to_date, dm.dept_no from dept_manager as dm inner join salaries as s on dm.emp_no = s.emp_no where dm.to_date='9999-01-01' and s.to_date='9999-01-01'
【!】主意:salaries的from_date是当前薪水的开始时间,而dept_manager的from_date是当上部门经理的开始时间,所以两个表的from_date是不一样的。当上部门经理之后,可能还会有很多次的加薪机会。
--------------------------------------------------
题目4:查找所有已经分配部门的员工的last_name和first_name
select e.last_name, e.first_name, de.dept_no from employees as e inner join dept_emp as de on e.emp_no = de.emp_no
两个表选择任何一个做主表都能通过测试。
--------------------------------------------------