~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:PLSQL Developer与SQL语句
作者:谢钟焕
撰写时间: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