作者:老表-简说Python
题目来源:https://www.nowcoder.com/ta/sql
首先说下上一题中留的讨论问题:为什么where中不能使用聚合函数?
理由很简单,聚合函数是对列进行操作的,而where是对行数据进行筛选的,所以不能在where中不能使用聚合函数,但是在having中是可以使用的。
为什么呢?你可以评论区留言说说你的看法。
SQL2 查找入职员工时间排名倒数第三的员工所有信息
我的思路: 先取出入倒数第三的hire_date(员工入职日期),然后取出对应hire_date(员工入职日期)的数据行即可。
我的题解:
select * from employees where hire_date = ( select hire_date from employees group by hire_date order by hire_date desc limit 2,1 );
涉及知识点:
- 子查询(嵌套查询)
- 子查询sql执行顺序:from-group by-select-order by-limit,补充完整sql执行顺序:
from -> where -> group by -> having -> select -> order by -> limit
- 排序:order by 字段名称 desc/asc (desc 降序,asc 升序)
- 从指定位置开始取出指定行:limit m,n
提交结果:
其他题解学习:
思路: 首先按hire_date进行降序排序,然后直接利用row_number()函数给数据进行标号,取出标号为3的那条数据即可。
select emp_no, birth_date, first_name, last_name, gender, hire_date from ( select *, row_number() over (order by hire_date desc) as rownum from employees ) a1 where rownum = 3;
另外还有几个新增知识点:
- row_number() over (partition by col1 order by col2) 表示按col1进行分区,然后每个区块内按col2进行升序排序,并给对应的区块内编号(也可以不写分区,就整个数据集为一个分区);
理论上来说如果有相同入职时间的人,这种方法就不科学了。