当前位置: 代码迷 >> 综合 >> ORCL 数据库 TOP-IN分析
  详细解决方案

ORCL 数据库 TOP-IN分析

热度:30   发布时间:2023-12-27 21:08:05.0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:PLSQL DeveloperSQL语句

作者:谢钟焕

撰写时间:2019/03/27

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

题目:查询出工资在10000~20000的员工,并将其工资从大到小排序,将其中排名5~10的显示

 

首先第一步查询10000~20000工资的员工并倒序排序,就可以实现工资的从大到小排序

SELECT LAST_NAME,SALARY FROM EMPLOYEES WHERE SALARY BETWEEN 10000 AND 20000 ORDER BY SALARY DESC

誒!这个时候就有一个问题。我应该怎么将其中排名5~10的员工工资提取出来呢?

这个时候就有那么一个关键字 “ROWNUM :伪列”

SELECT ROWNUM,LAST_NAME FROM EMPLOYEES;

那么现在我们是不是可以直接判断 我们的 “ROWNUM : 伪列” 就可以获得 5~10 的员工工资了呢!

 

 

SELECT ROWNUM,A.* FROM

      (SELECT LAST_NAME,SALARY FROM EMPLOYEES

       WHERE SALARY BETWEEN 10000 AND 20000 ORDER BY SALARY DESC) A

那么我现在加上我的 WHERE 条件来筛选 ROWNUM

SELECT ROWNUM,A.* FROM

      (SELECT LAST_NAME,SALARY FROM EMPLOYEES

       WHERE SALARY BETWEEN 10000 AND 20000 ORDER BY SALARY DESC) A

WHERE ROWNUM >= 5 AND ROWNUM <= 10

尝试了一下,这样筛选使用 ROWNUM实在是不行,为什么呢?

因为ROWNUM 它自身只能使用 < , <= 进行比较,使用其他的比较符会无法返回任何数据。

SELECT ROWNUM,A.* FROM

       (SELECT LAST_NAME,SALARY FROM EMPLOYEES

        WHERE SALARY BETWEEN 10000 AND 20000 ORDER BY SALARY DESC) A

WHERE ROWNUM <= 10

那么我岂不是不能用它来筛选出排名是5~10的员工工资了吗?

哦!那倒并不是,请看下面,因为当再嵌套一层select之后呢,它里面的rownum便不再算是伪列了,

而是变成了一个列,所以我们在此就可以直接拿它进行筛选

SELECT B.* FROM (SELECT ROWNUM X,A.* FROM

                (SELECT LAST_NAME,SALARY FROM EMPLOYEES

                 WHERE SALARY BETWEEN 10000 AND 20000 ORDER BY SALARY DESC) A) B

           WHERE B.X >= 5 AND B.X <= 10