从SQL执行顺序看oracle文档对rownum的解析

linwaterbin 2012-04-17 05:52:05
首先,标准的 SQL 的解析顺序为:
(1).FROM 子句, 组装来自不同数据源的数据
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序

然后,oracle联机文档对rownum的解释:“The first row selected has a ROWNUM of 1, the second has 2, and so on.”注意:只有当the first row 为真,the second 才会被has 2哦。文档给出的例子是:SELECT * FROM employees WHERE ROWNUM > 1。这里from 先执行,第一行被标志为1,然后执行where字句,发现1>1,为假;则继续第二行被标志为1,也发现为假,。。。,全部行都发现为假当然就没有数据返回咯。

再来看文档给出的一个例子,“SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11”。从sql执行顺序看,SELECT * FROM employees ORDER BY employee_id先解析,The first row fetched is assigned a ROWNUM of 1,发现<11,放入结果集中。。。;

其实,从执行顺序看rownum可以理解一切rownum的问题哦(当然啦,可能呢有点夸张呢)。譬如,度娘哪有人问了个问题:

selectrownum r, ename from emp where r < 10;

select rownum r, ename from emp where rownum< 10;

这两句话只是一个用r,一个用rownum筛选,为什么用r就不行?

现在,各看官明白了没?还是执行顺序的问题哦。如果你非要用专业眼光来看呢,是个实例化的问题呢。他这是实例化处理错了。我们来看个实例化的例子:

SELECT empno,ename, job, mgr, hiredate

FROM (SELECT empno,ename, job, mgr, hiredate, rownum rk FROM emp) t

WHERE rk > 2

到这里,归根结底,实例化的本质还是执行顺序的问题啦。反正就是执行顺序问题啦。

好啦。不说了。能力有限,理解有误,心里没底呀。哎。。读书人一声长叹哦。流言止于智者,帖子止于呵呵
...全文
227 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a584666873a 2012-04-18
  • 打赏
  • 举报
回复
我整理的例子(验证过的):
SELECT * FROM
(
SELECT t.*, ROWNUM rw FROM tbl_lzy t
) t1
WHERE t1.rw > 5 AND t1.rw< 10 ;

1、有结果(10条):
SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM > 0 AND ROWNUM < 10; 处理当前行时大于0
2、没有结果
SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM > 1 AND ROWNUM < 10; 处理当前行时不能大于1
3.有结果: SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM >= 1 AND ROWNUM < 10; 处理当前行时满足等于rownumber=1

总结:ROWNUMBER是在有结果的情况下处理
linwaterbin 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

rownum有这么多问题吗?
rownum不是表中已经提前定义好的列,它是在查询的过程中动态生成的数据,当然不能把对固定列的用法直接附加到这个伪列上,楼主想的有点复杂。
[/Quote]看了这么多还是您这句话在理,“rownum不是表中已经提前定义好的列,它是在查询的过程中动态生成的数据”分就全给您啦。
现在 2012-04-18
  • 打赏
  • 举报
回复
学习了。谢谢楼主。
bayueguihuaxiang 2012-04-18
  • 打赏
  • 举报
回复
谢谢
有收获
lxyzxq2008 2012-04-17
  • 打赏
  • 举报
回复
rownum有这么多问题吗?
rownum不是表中已经提前定义好的列,它是在查询的过程中动态生成的数据,当然不能把对固定列的用法直接附加到这个伪列上,楼主想的有点复杂。
linwaterbin 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

好好理解伪列 rownum 。。
[/Quote]初学者啊。理解有误。请指教!!!
youqi1984 2012-04-17
  • 打赏
  • 举报
回复
好好理解伪列 rownum 。。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧