首先让我们看一下 HR.EMPLOYEES 这张表的结构:
问题需求:
查出薪水最高的5-10条数据
答案:
select * from
(select rownum r, e1.* from
(
select e.* from hr.employees e order by e.salary desc
) e1
) e2 where e2.r >=5 and e2.r<=10
为什么要这么麻烦? 为什么不能这样写?
错误示范:
select rownum r, e1.* from
(
select e.* from hr.employees e order by e.salary desc
) e1
where e1.r >=5 and e1.r<=10
因为rownum的运行机制问题,所以呢,这种方法当前查得是当前生成得e1的rownum,所以查看出来的第一条数据其给它附的id为1,然后后面有执行e1.r的判断,所以那个e1的第一条数据(id为1)不符合大于等于5小于等于10,第一条不符合,那么它就会执行销毁,所以本来的第二条也会成为id为1,然后继续执行,所以第二条也不符合,如果想使它符合,那么只能让e1.r大于0即可,否则其它条件都是不可以的,如果你想让其大于1或者及以上,就必须多包含一层,让其变成一个数据集,再从数据集里面取就可以取到(这就是为什么要多取一层的原因),不然你执行这个语句,一条数据都没有而且还会报错。
课外知识点补充:
SQL Select语句完整的执行顺序:
- from子句组装来自不同数据源的数据;
- where子句基于指定的条件对记录行进行筛选;
- group by子句将数据划分为多个分组;
- 使用聚集函数进行计算;
- 使用having子句筛选分组;
- 计算所有的表达式;
- select 的字段;
- 使用order by对结果集进行排序。