2021-07-12 SQL(牛客网)刷题 1~3题

SQL1 查找最晚入职员工的所有信息


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 查找入职员工时间排名倒数第三的员工所有信息



SQL2 题目与解答

疑问:这道题为什么用这个rank窗口函数来查询是不对的?但是我在Navicat上能运行出来:


SQL2  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


SQL3 题目与解答 


SQL3 题目与解答 


SQL3 题目与解答 


SQL3 Navicat解答

注意:

左连接查询,以薪水信息表为主表,勿忘记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

你可能感兴趣的:(2021-07-12 SQL(牛客网)刷题 1~3题)