目录
一、题目描述
有一个员工employees表简况如下:
请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:
二、思路
思路1:倒序
原理同SQL1中所用到的order by
+limit
将数据元素按照入职时间倒序排序,选择第3行数据即可
SELECT
*
FROM
employees
ORDER BY
hire_date DESC
LIMIT
2,1
-- 等价于 limit 1 offset 2
-- 从第2行(第1行为0)开始,返回1条数据——第3行数据
但这种情况明显只适用于没有并列值的情况
一旦出现并列,则会导致实际获取数据并非真实的第3
思路2:找到第3大值
-
通过内层循环,将表按照hire_date分组,这样可以得到近似去重后的hire_date,再用limit取第三
select
*
from
employees
where
hire_date = (
select hire_date
from employees
group by hire_date
order by hire_date DESC
limit 2,1
)
-
同理,也可以用distinct,来实现对hire_date去重,再用limit取第三
select
*
from
employees
where
hire_date =(
select distinct hire_date
from employees
order by hire_date DESC
limit 2,1
)
二者殊途同归,不管是group by还是distinct,目的都是去重~
知识点——group by
-
多个字段分组
select hire_date
from employees
group by hire_date, emp_num # 双层分组
order by hire_date DESC
limit 2,1
-
常常配合聚合函数一起使用
-
count()
select name , count(*) from student group by name
-- 查看表中相同人名的个数
-
sum()
select name , sum(salary) from student group by name
-- 查看表中人员的工资和(同姓的工资相加)
-
avg()
select name , avg(salary) from student group by name , grade
-- 查看表中人员的工资平均数(同姓工资平均数)
-
max()/min()
select grade , max(salary) from student group by grade
-- 查看按等级划分人员工资最大值/最小值