SQL1 查找最晚入职员工的所有信息
考察点:
聚合函数 max() 、min()可以用来返回非数值数据的最大值、最小值;
标量子查询
解答:
1.构建最晚日期的标量子查询:
select max(hire_date) from employees;
2.查找对应日期的记录(该日期下可能有多个员工同时入职)
select * from employees
where hire_date in (select max(hire_date) from employees)
###这里可以用“=”也可以用 “in”
注意:首先审题本题说的是最晚入职员工的所有信息很多人说用limit降序,取第一条这样是不对的,如果最晚的入职时间有多个人入职明显就漏了答案。
SQL2 查找入职员工时间排名倒数第三的员工所有信息
疑问:这道题为什么用这个rank窗口函数来查询是不对的?但是我在Navicat上能运行出来:
别人的回答:
三种解法
题解一 假设不存在相同入职时间的员工 直接倒叙排序 取第三名
ps.这种可以通过官方示例
select * from employees order by hire_date desc limit 2,1
(LIMIT 语法
1.limit 1,3 从1位置向后取3条记录。
2.limit 3 offset 1 等价于 limit 1,3。)
题解二 存在相同入职时间的员工 先取第三名的入职时间 再比较
子查询
SELECT * FROM employees WHERE hire_date = (SELECT hire_date from employees ORDER BY hire_date DESC LIMIT 2, 1);
or 关联查询
SELECT t1.* FROM employees t1 JOIN (SELECT hire_date from employees ORDER BY hire_date DESC LIMIT 2, 1)t2
ON t1.hire_date = t2.hire_date;
题解三 存在相同入职时间的员工,另一种解答思路:
利用group by 倒叙第三名 即比当前员工入职时间迟的员工应该有2个
select t1.* from employees t1
left join employees t2 on t1.hire_date < t2.hire_date
GROUP BY t1.emp_no,t1.hire_date
having count(t2.emp_no) = 2;
SQL3 查找当前薪水详情以及部门编号dept_no
注意:
左连接查询,以薪水信息表为主表,勿忘记on条件和体重规定的最后一列dept_no
SELECT
s.*,
d.dept_no
FROM
salaries s
LEFT JOIN dept_manager d
ON s.emp_no = d.emp_no
WHERE s.to_date = '9999-01-01'
AND d.to_date = '9999-01-01'
ORDER BY s.emp_no