[SQL数据库易错点] 子查询 | 分页查询案例学习

首先让我们看一下 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语句完整的执行顺序:

  1. from子句组装来自不同数据源的数据;
  2. where子句基于指定的条件对记录行进行筛选;
  3. group by子句将数据划分为多个分组;
  4. 使用聚集函数进行计算;
  5. 使用having子句筛选分组;
  6. 计算所有的表达式;
  7. select 的字段;
  8. 使用order by对结果集进行排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章