[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对结果集进行排序。
rownum不能通过表的别名来使用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值